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.png2.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方法的灵活造就了他的便捷,但也是他的灵活突出了他的不确定性,灵活的底层难以单测是我觉得有问题的地方,另外看过对应代码后也证实了我心里的担心
网友评论