mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

本文档主要描述mybaits-plus是怎样将BaseMapper注入到接口中,并且能够运行的。要了解这个就要了解mybatis是怎样运行的。mybatis通过三个步骤运行。第一扫描配置文件及xml将配置信息和xml中的每个方法登记再config中。第二执行时通过代理执行登记的方法信息。第三执行过程解析配置及参数等信息。

 

 

mybatis原理

 

  • 扫描xml并登记
  1. Mybatis Configuration类

mybatis启动的时会生成Configuration对象,由这个对象记录mybatis配置。

  1. 登记xml的sql信息

 在Configuration 中定义属性记录方法和xml中登记的方法的映射关系,如下代码Map<String, MappedStatement> mappedStatements。这个Map的key就是命名空间+xml中方法的ID。MappedStatement记录的是方法的内容。MappedStatement中有个重要的属性SqlSource。这个属性就记录的xml中的源sql语句的解析。

 

  • 执行

mybatis是通过动态代理来执行。我们接口mybaits接口称之为mapper,那么是怎样将接口和刚才登记的信息关联起来的呢?这里通过java的动态代理。可以上网学习下java的动态代理的知识。由这个动态代理执行接口的方法,在执行的过程中关联。

  1. 获取代理

 

mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 图一

mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图二

 

图一是获取代理,通过mapperProxyFactory.newInstance(sqlSession)创建了一个代理。图二是代理,invoke是真正执行sql的地方,它获取了MapperMethod的对象,这个对象由method来获取。method就是接口方法的反射对象。然后将args传入方法执行。

2、执行

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图三

如图三,MapperMethod构造函数构造了SqlCommon。MapperMethod的execute就是图二调用的。这个方法里面,最终是通过sqlSession执行insert或者update。图四就是sqlSession中执行update的方法。参数statement就是命名空间+方法名,通过参数statement获取登记的MappedStatement信息。然后又executor执行MappedStatement

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图四

 

  • 解析配置

在执行executor时,是怎样实现xml中登记的sql动态解析的呢?比如我们xml配置<if>,<where>,<choose>等等。这里其实就是执行的MappedStatement的getBoundSql(),如图

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图五

图书的第一句代码就是从sqlSource.getBoundSql()。其中SqlSource是个接口其实现有如下类

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图六

那么其中DynamicSqlSource就是动态解析xml的sql的。在第一步登记的时候就已经分配好。这里调用的得到动态sql的最终执行命名。然后再由参数装配上。再将结果解析成返回结果。整个执行过程就完成了。

 


Mybatis-plus BaseMapper 注册原理

明白上面的过程我们就好理解mybatis-plus是在哪里做手脚的。第一在登记时候的将接口继承的baseMapper的方法生成MappedStatement 登记在配置信息中。这样在新的过程能找到。

 

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

图七

图七是添加的入口。

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图八

图七通过方法追踪,最终会执行图八的injetMapperStatement方法。所有methods下的方法都实现了这个接口。

 mybatis原理 及 mybaits-plus是怎样将BaseMapper注入到接口中

 

图九

图九是insert方法。在这个方法里面它创建的SqlSourse。然后有SqlSourse构建mappedStatement中,最后将mappedStatement写到mybaits的配置文件中。这样就完成了xml的登记,然后执行的时候mybatis就能执行执行了