美文网首页程序员
优雅单测-6基于Mybatis支持苞米豆单测-源码实现详解

优雅单测-6基于Mybatis支持苞米豆单测-源码实现详解

作者: uncle_hangzhou | 来源:发表于2020-06-30 15:47 被阅读0次

    1.苞米豆MyBatis-Plus介绍

    MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变。核心功能为提供一套通用的CRUD框架,使用者只要专注拼接sql逻辑即可

    上篇介绍了如何使用Baomidou做单元测试,本篇主讲Baomidou框架是如何实现通过BaseMapper接口,提供高效的CRUD功能的

    2.MyBatis-Plus实现原理

    上篇介绍到,使用Baomidou和直接使用Mybatis运行的区别,主要在于MybatisSqlSessionFactoryBean替换掉SqlSessionFactoryBean,同时也介绍了SqlSessionFactoryBean的作用是SqlSessionFactoryBean是生产SqlSessionFactory的Spring Bean。

    所以现在主要看一下两者之间区别,MybatisSqlSessionFactoryBean在里面做了额外的什么?Baomidou报矿如何通过BaseMapper接口,提供高效的CRUD功能的?

    2.1 支持的通用CRUD方法

    image.png image.png

    可以看到用来注入的默认方法,代表着通用的CRUD。该所有方法通过 AbstractSqlInjector类,完成Mapper的CURD 动态 SQL注入

    下面通过代码来看baomidou是如何通过MybatisSqlSessionFactoryBean代替SqlSessionFactoryBean,完成注入通用的crud方法的

    2.2 CRUD方法如何注入

    注: 对比代码左边为苞米豆,右边为Mybatis,方便对比记忆

    2.2.1.MybatisSqlSessionFactoryBean类

    拷贝自 org.mybatis.spring.SqlSessionFactoryBean, 修改方法 buildSqlSessionFactory() 加载自定义:

    image.png

    2.2.2.MybatisXmlConfigBuilder

    MybatisXmlConfigBuilder.parse中解析了很多配置


    2.png 3.png

    2.2.3. 苞米豆解析Mapper解析过程,动态注入CURD SQL

    4.png

    此处重点 GlobalConfigUtils.getSqlInjector 会返回 ISqlInjector接口,默认实现就是苞米豆的核心模板类 AbstractSqlInjector(SQL自动注入器)

    2.2.4.核心类AbstractSqlInjector的注入

    image.png

    最后 如第一张图,会把所有的CRUD方法动态注入到Mapper中,感兴趣的同学可以继续看一下里面是怎么实现的

    3.其他

    说说我对苞米豆的感觉,整体来说Mybatis-Plus能给开发者带来很多便捷,并且本身站在Mybatis框架基础上只增不减,非常易于上手。 同时支持了类似JPA的功能,还支持原生的复杂SQL编写,可以说爽到起飞的感觉

    另外除了站在开发者角度,站在架构角度来看我是不愿意使用的,原因是DAO层作为系统架构偏底层,需要非常非常坚实。 Mybatis-Plus说是只做增强不做改变,还不如说是“大部分”只做增强不做改变(除了继承还是COPY的关系)。 Mybatis-Plus的动态生成SQL方法的灵活造就了他的便捷,但也是他的灵活突出了他的不确定性,灵活的底层难以单测是我觉得有问题的地方,另外看过对应代码后也证实了我心里的担心

    相关文章

      网友评论

        本文标题:优雅单测-6基于Mybatis支持苞米豆单测-源码实现详解

        本文链接:https://www.haomeiwen.com/subject/ecyxqktx.html