工作问题详解:tkMybatis通用mapper封装

简介: 工作问题详解:tkMybatis通用mapper封装

mybatis是当下主流框架都会去集成的东西,而tkMybatis是对mybatis的封装。他处理了基本的增删改查也处理了很多高级条件查询。


小余哥之前用tkmybatis都是只用到基础的增删改查。

image.png

比如  :


SelectAll
insertSelective
updateByPrimaryKeySelective

这种最基础的增删改查,大家可以看到其实tkmybatis有封装很多方法,其实只是我们不怎么去调用而已。


先附上小余哥集成的tkmybatis,大家也可以像我这样操作

pom

 <!-- tkmybatis -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.1.5</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.persistence</groupId>
                    <artifactId>persistence-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

CommonBaseMapper



import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.ExampleMapper;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.MySqlMapper;
import tk.mybatis.mapper.common.RowBoundsMapper;
import tk.mybatis.mapper.common.base.BaseInsertMapper;
import tk.mybatis.mapper.common.base.delete.DeleteByPrimaryKeyMapper;
import tk.mybatis.mapper.common.base.delete.DeleteMapper;
import tk.mybatis.mapper.common.base.insert.InsertSelectiveMapper;
import tk.mybatis.mapper.common.base.select.ExistsWithPrimaryKeyMapper;
import tk.mybatis.mapper.common.base.select.SelectAllMapper;
import tk.mybatis.mapper.common.base.select.SelectByPrimaryKeyMapper;
import tk.mybatis.mapper.common.base.select.SelectCountMapper;
import tk.mybatis.mapper.common.base.select.SelectMapper;
import tk.mybatis.mapper.common.base.select.SelectOneMapper;
import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeyMapper;
import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeySelectiveMapper;
import tk.mybatis.mapper.common.condition.DeleteByConditionMapper;
import tk.mybatis.mapper.common.condition.SelectByConditionMapper;
import tk.mybatis.mapper.common.condition.SelectCountByConditionMapper;
import tk.mybatis.mapper.common.condition.UpdateByConditionMapper;
import tk.mybatis.mapper.common.condition.UpdateByConditionSelectiveMapper;
import tk.mybatis.mapper.common.example.SelectByExampleMapper;
import tk.mybatis.mapper.common.example.UpdateByExampleSelectiveMapper;
import tk.mybatis.mapper.common.ids.DeleteByIdsMapper;
import tk.mybatis.mapper.common.ids.SelectByIdsMapper;
import tk.mybatis.mapper.common.rowbounds.SelectByExampleRowBoundsMapper;

@RegisterMapper
public interface CommonBaseMapper<T> extends Marker,
    //tk-mybatis 基础查询接口
    SelectOneMapper<T>,
    SelectMapper<T>,
    SelectAllMapper<T>,
    SelectCountMapper<T>,
    SelectByPrimaryKeyMapper<T>,
    ExistsWithPrimaryKeyMapper<T>,
    SelectByIdsMapper<T>,
    SelectByConditionMapper<T>,
    SelectCountByConditionMapper<T>,
    SelectByExampleMapper<T>,
    SelectByExampleRowBoundsMapper<T>,

    //基础更新接口
    UpdateByPrimaryKeyMapper<T>,
        UpdateByPrimaryKeySelectiveMapper<T>,
        UpdateByConditionMapper<T>,
        UpdateByConditionSelectiveMapper<T>,
        UpdateByExampleSelectiveMapper<T>,

        //基础删除接口
        DeleteMapper<T>,
        DeleteByPrimaryKeyMapper<T>,
        DeleteByConditionMapper<T>,
        DeleteByIdsMapper<T>,
        //基础新增
        BaseInsertMapper<T>,
        InsertSelectiveMapper<T>,
        BaseMapper<T>,

        //高级api接口
        ExampleMapper<T>,
        RowBoundsMapper<T>,
        MySqlMapper<T>,
        ConditionMapper<T>{}

dao层实现

image.png

FactoryClassMapper是dao接口,

继承CommonBaseMapper<FactoryClass>

CommonBaseMapper是上面的tkmybatis封装类

FactoryClass是实体类。

service只要注入dao层mapper就可以直接使用tkmybatis的那些接口了


下面我们看看实现

image.png

CommonBaseMapper 里面一个RegisterMapper注解


点进去看一下

image.png

作者写了注释这个注解用于自动注册mapper接口的标记

springboot做的最好的一个就是可以注解驱动。

哪如果我们去掉这个注解会怎么样?

image.png

实践证明 spring容器会找不到这个bean然后报错。

我们继续看CommonBaseMapper 里面的方法实现

随便找一个我们点到接口里面看


@RegisterMapper
public interface SelectByPrimaryKeyMapper<T> {

    /**
     * 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
     *
     * @param key
     * @return
     */
    @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
    T selectByPrimaryKey(Object key);

}

大家看到这里是不是有点熟悉?

spring注解写sql也是这样吗?selectProvider 然后声明type是哪个class文件

然后通过method指定哪个方法。(不懂的朋友百度一下spring注解写sql,网上一堆)

在往下就是对于selectProvide的一些封装了。大家有兴趣的可以自己研究

image.png

今天小余哥遇到的问题是,我之前每次写分页用的是封装pagehelp方法都需要去写分页的sql xml,恶心了我好久。


SelectByExampleRowBoundsMapper方法直接可以解决分页问题,为此

我百度了一下用法,找了一会发现没有教怎么用的,翻看源码实现发现有个

RowBounds,

 List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds);

他自己弄了构造方法,你只需要在用这个方法的时候创建他,然后传入页码和条数就可以直接分页!!!!


Example example = new Example(FactoryClass.class);
Example.Criteria criteria = example.createCriteria();
List<FactoryClass> factoryClasses = factoryClassMapper.selectByExampleAndRowBounds(example, new RowBounds(query.getCurrentNum(),query.getPageSize()));

这里的Example 是用来做高级查询条件的有兴趣的朋友可以研究一下这个类。

我现在基本不用xml文件来写sql了除非复杂逻辑才去使用。

@Override
    public PageResult<List<FactoryClass>> queryPage(WorkDayQuery query) {
        PageResult<List<FactoryClass>> result = new PageResult<>();
        List<FactoryClass> factoryClasses = factoryClassMapper.selectByExampleAndRowBounds( new Example(FactoryClass.class), new RowBounds(query.getCurrentNum(),query.getPageSize()));
        result.setList(factoryClasses);
        result.setCount(factoryClasses.size());
        return result;
    }
相关文章
|
3月前
|
SQL druid Java
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(上)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
68 0
|
3月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
363 1
|
3月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
28 0
|
10月前
|
SQL 存储 Java
如何模拟MyBatis对象映射赋值的过程,以及如何通过这种方式来简化我们的JDBC开发工作?
如何模拟MyBatis对象映射赋值的过程,以及如何通过这种方式来简化我们的JDBC开发工作?
72 0
|
Java Maven 数据库
最详细通用mapper代码生成器配置
最详细通用mapper代码生成器配置
228 0
最详细通用mapper代码生成器配置
|
安全 Java 关系型数据库
集中式整合之加入通用mapper|学习笔记
快速学习集中式整合之加入通用mapper
57 0
|
SQL Java 数据库连接
数据层设计与开发(数据层标准实现类) | 学习笔记
简介:快速学习数据层设计与开发(数据层标准实现类)
123 0
数据层设计与开发(数据层标准实现类) | 学习笔记
|
存储 分布式计算 自然语言处理
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
|
JSON 前端开发 数据格式
|
Java 关系型数据库 数据库连接
如何使用通用Mapper
集成方法请看上面的文档,集成后,可以继续阅读本页文档。 1. 继承通用的Mapper,必须指定泛型 例如下面的例子: public interface UserInfoMapper extends Mapper { //其他必须手写的接口... } 一旦继承了Mapper,继承的Mapper就拥有了Mapper所有的通用方法。
1870 0