工作问题详解: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月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之dal层中的mapper数据源类型进行组织的问题如何解决
Java应用结构规范问题之dal层中的mapper数据源类型进行组织的问题如何解决
|
4月前
|
Java
设计接口的几种方法
设计接口的几种方法
|
5月前
|
Java
JavaSE——面向对象基础(3/4)-封装、实体JavaBean(什么是封装、封装的设计规范、什么是实体类、实体类的应用场景)
JavaSE——面向对象基础(3/4)-封装、实体JavaBean(什么是封装、封装的设计规范、什么是实体类、实体类的应用场景)
44 6
|
6月前
|
安全 前端开发 NoSQL
如果让你设计一个接口,你会考虑哪些问题?
接口设计需关注参数校验、扩展性、幂等性、日志、线程池隔离、异常重试、异步处理、查询优化、限流、安全性、锁粒度和避免长事务。入参与返回值校验确保数据正确性;考虑接口扩展性以适应不同业务需求;幂等设计防止重复操作;关键接口打印日志辅助问题排查;核心接口使用线程池隔离确保稳定性;异常处理中可采用重试机制,注意超时控制;适合异步的场景如用户注册后的通知;并行查询提升性能;限流保护接口,防止过载;配置黑白名单保障安全;适当控制锁粒度提高并发性能;避免长事务影响系统响应。
|
6月前
|
XML Java 数据库连接
* 完成单表操作:需要3个功能。 * 功能1:使用注解 * 功能2:通用Mapper * 功能3:使用xml
* 完成单表操作:需要3个功能。 * 功能1:使用注解 * 功能2:通用Mapper * 功能3:使用xml
117 0
|
SQL 存储 Java
如何模拟MyBatis对象映射赋值的过程,以及如何通过这种方式来简化我们的JDBC开发工作?
如何模拟MyBatis对象映射赋值的过程,以及如何通过这种方式来简化我们的JDBC开发工作?
104 0
|
存储 分布式计算 自然语言处理
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
|
安全 Java 关系型数据库
集中式整合之加入通用mapper|学习笔记
快速学习集中式整合之加入通用mapper