本文档主要描述mybaits-plus是怎样将BaseMapper注入到接口中,并且能够运行的。要了解这个就要了解mybatis是怎样运行的。mybatis通过三个步骤运行。第一扫描配置文件及xml将配置信息和xml中的每个方法登记再config中。第二执行时通过代理执行登记的方法信息。第三执行过程解析配置及参数等信息。
mybatis原理
- 扫描xml并登记
- Mybatis Configuration类
mybatis启动的时会生成Configuration对象,由这个对象记录mybatis配置。
- 登记xml的sql信息
在Configuration 中定义属性记录方法和xml中登记的方法的映射关系,如下代码Map<String, MappedStatement> mappedStatements。这个Map的key就是命名空间+xml中方法的ID。MappedStatement记录的是方法的内容。MappedStatement中有个重要的属性SqlSource。这个属性就记录的xml中的源sql语句的解析。
- 执行
mybatis是通过动态代理来执行。我们接口mybaits接口称之为mapper,那么是怎样将接口和刚才登记的信息关联起来的呢?这里通过java的动态代理。可以上网学习下java的动态代理的知识。由这个动态代理执行接口的方法,在执行的过程中关联。
- 获取代理
图一
图二
图一是获取代理,通过mapperProxyFactory.newInstance(sqlSession)创建了一个代理。图二是代理,invoke是真正执行sql的地方,它获取了MapperMethod的对象,这个对象由method来获取。method就是接口方法的反射对象。然后将args传入方法执行。
2、执行
图三
如图三,MapperMethod构造函数构造了SqlCommon。MapperMethod的execute就是图二调用的。这个方法里面,最终是通过sqlSession执行insert或者update。图四就是sqlSession中执行update的方法。参数statement就是命名空间+方法名,通过参数statement获取登记的MappedStatement信息。然后又executor执行MappedStatement
图四
- 解析配置
在执行executor时,是怎样实现xml中登记的sql动态解析的呢?比如我们xml配置,,等等。这里其实就是执行的MappedStatement的getBoundSql(),如图
图五
图书的第一句代码就是从sqlSource.getBoundSql()。其中SqlSource是个接口其实现有如下类
图六
那么其中DynamicSqlSource就是动态解析xml的sql的。在第一步登记的时候就已经分配好。这里调用的得到动态sql的最终执行命名。然后再由参数装配上。再将结果解析成返回结果。整个执行过程就完成了。
Mybatis-plus BaseMapper 注册原理
明白上面的过程我们就好理解mybatis-plus是在哪里做手脚的。第一在登记时候的将接口继承的baseMapper的方法生成MappedStatement登记在配置信息中。这样在新的过程能找到。
图七
图七是添加的入口。
图八
图七通过方法追踪,最终会执行图八的injetMapperStatement方法。所有methods下的方法都实现了这个接口。
图九
图九是insert方法。在这个方法里面它创建的SqlSourse。然后有SqlSourse构建mappedStatement中,最后将mappedStatement写到mybaits的配置文件中。这样就完成了xml的登记,然后执行的时候mybatis就能执行执行了