浅谈Mybatis Plus的BaseMapper的方法是如何注入的

 更新时间:2021年09月15日 10:34:29   作者:王伟王胖胖  
我们在用的时候经常就是生产自定义的Mapper继承自BaseMapper,那么BaseMapper怎么被注入到mybatis里的,本文就详细的介绍一下,感兴趣的可以了解一下

Mybatis Plus的BaseMapper的方法

我们在用的时候经常就是生产自定义的Mapper继承自BaseMapper,然后我们就可以使用了,但是有没想过BaseMapper里的方法是怎么被注入到mybatis里的,也没看到什么xml啊,今天我们就来看看是怎么回事。

在这里插入图片描述

Mybatis Plus的初始化方法

MybatisPlusAutoConfiguration中的SqlSessionFactory

在创建的时候会创建MybatisSqlSessionFactoryBean,然后设置MybatisConfiguration作为配置类。

在这里插入图片描述

MybatisConfiguration是继承自Configuration的:

在这里插入图片描述

自定义了一个MybatisMapperRegistry注册器,后面会用到。

在这里插入图片描述

BaseMapper方法的注入的过程

MybatisSqlSessionFactoryBean的初始化后方法afterPropertiesSet调用buildSqlSessionFactory创建SqlSessionFactory

在这里插入图片描述

其实就会去解析自定义的mapperxml文件:

在这里插入图片描述

在这里插入图片描述

其中有个addMapper的方法,是前面MybatisConfiguration调用的。

在这里插入图片描述

会解析出对应的类型,然后内部调用MybatisMapperRegistry的方法:

在这里插入图片描述

内部最后是MybatisMapperAnnotationBuilder去解析的:

在这里插入图片描述

里面会进行基本的SQL方法注入:

在这里插入图片描述

在这里插入图片描述

完成每个方法的注入:

在这里插入图片描述

注入的实现:

在这里插入图片描述

其实每一个AbstractMethod的子类都会实现自己的injectMappedStatement

在这里插入图片描述

在这里插入图片描述

最后会去枚举类SqlMethod中获取对应的枚举,里面就是类似定义在xml中的信息,最后转换为sqlSource再进行封装:

在这里插入图片描述

SqlMethod 枚举值:

public enum SqlMethod {
    /**
     * 插入
     */
    INSERT_ONE("insert", "插入一条数据(选择字段插入)", "<script>\nINSERT INTO %s %s VALUES %s\n</script>"),
    UPSERT_ONE("upsert", "Phoenix插入一条数据(选择字段插入)", "<script>\nUPSERT INTO %s %s VALUES %s\n</script>"),

    /**
     * 删除
     */
    DELETE_BY_ID("deleteById", "根据ID 删除一条数据", "<script>\nDELETE FROM %s WHERE %s=#{%s}\n</script>"),
    DELETE_BY_MAP("deleteByMap", "根据columnMap 条件删除记录", "<script>\nDELETE FROM %s %s\n</script>"),
    DELETE("delete", "根据 entity 条件删除记录", "<script>\nDELETE FROM %s %s %s\n</script>"),
    DELETE_BATCH_BY_IDS("deleteBatchIds", "根据ID集合,批量删除数据", "<script>\nDELETE FROM %s WHERE %s IN (%s)\n</script>"),

    /**
     * 逻辑删除
     */
    LOGIC_DELETE_BY_ID("deleteById", "根据ID 逻辑删除一条数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
    LOGIC_DELETE_BY_MAP("deleteByMap", "根据columnMap 条件逻辑删除记录", "<script>\nUPDATE %s %s %s\n</script>"),
    LOGIC_DELETE("delete", "根据 entity 条件逻辑删除记录", "<script>\nUPDATE %s %s %s %s\n</script>"),
    LOGIC_DELETE_BATCH_BY_IDS("deleteBatchIds", "根据ID集合,批量逻辑删除数据", "<script>\nUPDATE %s %s WHERE %s IN (%s) %s\n</script>"),

    /**
     * 修改
     */
    UPDATE_BY_ID("updateById", "根据ID 选择修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
    UPDATE("update", "根据 whereEntity 条件,更新记录", "<script>\nUPDATE %s %s %s %s\n</script>"),

    /**
     * 逻辑删除 -> 修改
     */
    LOGIC_UPDATE_BY_ID("updateById", "根据ID 修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),

    /**
     * 查询
     */
    SELECT_BY_ID("selectById", "根据ID 查询一条数据", "SELECT %s FROM %s WHERE %s=#{%s} %s"),
    SELECT_BY_MAP("selectByMap", "根据columnMap 查询一条数据", "<script>SELECT %s FROM %s %s\n</script>"),
    SELECT_BATCH_BY_IDS("selectBatchIds", "根据ID集合,批量查询数据", "<script>SELECT %s FROM %s WHERE %s IN (%s) %s</script>"),
    SELECT_ONE("selectOne", "查询满足条件一条数据", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
    SELECT_COUNT("selectCount", "查询满足条件总记录数", "<script>%s SELECT COUNT(%s) FROM %s %s %s\n</script>"),
    SELECT_LIST("selectList", "查询满足条件所有数据", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
    SELECT_PAGE("selectPage", "查询满足条件所有数据(并翻页)", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
    SELECT_MAPS("selectMaps", "查询满足条件所有数据", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
    SELECT_MAPS_PAGE("selectMapsPage", "查询满足条件所有数据(并翻页)", "<script>\n %s SELECT %s FROM %s %s %s\n</script>"),
    SELECT_OBJS("selectObjs", "查询满足条件所有数据", "<script>%s SELECT %s FROM %s %s %s\n</script>");

    private final String method;
    private final String desc;
    private final String sql;

    SqlMethod(String method, String desc, String sql) {
        this.method = method;
        this.desc = desc;
        this.sql = sql;
    }

    public String getMethod() {
        return method;
    }

    public String getDesc() {
        return desc;
    }

    public String getSql() {
        return sql;
    }
}

最终还是调用了MapperBuilderAssistantaddMappedStatement进行注册:

在这里插入图片描述

总结

  •  初始化注入自定义的MybatisConfiguration和MybatisMapperRegistry。
  • 解析Mapper类,获取方法对应的AbstractMethod。
  • 调用各自的实现进行去SqlMethod获取对应的枚举,获取到信息后进行注册。

其实就相当于代码里面定义了原本需要再xx.xml定义的数据,直接在代码中获取注入常用的CRUD操作即可。

到此这篇关于浅谈Mybatis Plus的BaseMapper的方法是如何注入的的文章就介绍到这了,更多相关Mybatis Plus BaseMapper注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring 项目常用pom文件的依赖

    Spring 项目常用pom文件的依赖

    这篇文章主要介绍了Spring 项目常用pom文件的依赖,文中给大家提到了Spring boot starter pom的依赖关系说明,需要的朋友参考下吧
    2018-03-03
  • Java中Properties配置类用法详解

    Java中Properties配置类用法详解

    所谓的配置文件问题,是指我们在开发时,经常需要读取和修改一些配置信息,比如数据库、消息队列、Nginx、Web服务器等的配置,为了便于修改这些信息,我们可以采用Properties配置类,本文给大家讲一下Properties配置类是怎么回事,以及怎么使用
    2023-06-06
  • 将对象转化为字符串的java实例

    将对象转化为字符串的java实例

    这篇文章主要介绍了将对象转化为字符串的java实例,有需要的朋友可以参考一下
    2013-12-12
  • IDEA中添加xml配置文件时,显示file问题

    IDEA中添加xml配置文件时,显示file问题

    这篇文章主要介绍了IDEA中添加xml配置文件时,显示file问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java FTP协议实现文件下载功能

    Java FTP协议实现文件下载功能

    FTP(File Transfer Protocol)就是文件传输协议。通过FTP客户端从远程FTP服务器上拷贝文件到本地计算机称为下载,将本地计算机上的文件复制到远程FTP服务器上称为上传,上传和下载是FTP最常用的两个功能
    2022-11-11
  • ReentrantLock可重入锁原理解析

    ReentrantLock可重入锁原理解析

    这篇文章主要为大家介绍了ReentrantLock可重入锁原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 详谈fastjson将对象格式化成json时的两个问题

    详谈fastjson将对象格式化成json时的两个问题

    下面小编就为大家带来一篇详谈fastjson将对象格式化成json时的两个问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 1小时快速上手RabbitMQ(简介及安装过程)

    1小时快速上手RabbitMQ(简介及安装过程)

    RabbitMQ简称MQ全称是Message Queue(消息队列),是在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信,本文给大家讲解了RabbitMQ简介与安装,结合实例代码给大家介绍的非常详细,需要的朋友跟随小编一起看看吧
    2023-01-01
  • Java中 this和super的用法与区别小结

    Java中 this和super的用法与区别小结

    在Java的学习与开发者我们经常遇到this和super关键字,本文主要介绍了Java中 this和super的用法与区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Java精确计算BigDecimal类详解

    Java精确计算BigDecimal类详解

    这篇文章主要介绍了Java精确计算BigDecimal类的使用方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论