Dao 接口的工作原理:
Dao 接⼝,就是⼈们常说的 Mapper 接⼝, 接⼝的全限名,就是映射⽂件中的 namespace的值,接⼝的⽅法名,就是映射⽂件中 MappedStatement 的 id 值,接⼝⽅法内的参数,就是传递给 sql 的参数。 Mapper 接⼝是没有实现类的,当调⽤接⼝⽅法时,接⼝全限名+⽅法名拼接字符串作为 key 值,可唯⼀定位⼀个 MappedStatement
Dao 接⼝⾥的⽅法,是不能重载的,因为是全限名+⽅法名的保存和寻找策略。
Dao 接⼝的⼯作原理是 JDK 动态代理, Mybatis 运⾏时会使⽤ JDK 动态代理为 Dao 接⼝⽣成代理 proxy 对象,代理对象 proxy 会拦截接⼝⽅法,转⽽执⾏ MappedStatement 所代表的 sql,然后将 sql 执⾏结果返回
Mybatis 如何分页:
Mybatis > 使⽤> RowBounds > 对象进⾏分⻚,它是针对 ResultSet 结果集执⾏的内存分⻚,⽽⾮物理分⻚,可以在 sql 内直接书写带有物理分⻚的参数来完成物理分⻚功能,也可以使⽤分⻚插件来完成物理分⻚。
分页插件的基本原理:
分⻚插件的基本原理是使⽤ Mybatis 提供的插件接⼝,实现⾃定义插件,在插件的拦截⽅法内拦截待执⾏的 sql,然后重写 sql,根据 dialect ⽅⾔,添加对应的物理分⻚语句和物理分⻚参数。
Mybatis 插件运行原理:
Mybatis 仅可以编写针对
ParameterHandler
、ResultSetHandler
、StatementHandler
、Executor
这四个接口的插件 Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler
的invoke()
方法编写插件:
- 实现 Mybatis 的
Interceptor
接口并实现intercept()
方法,- 给插件编写注解,指定要拦截哪一个接口的哪些方法
- 在配置文件种配置插件
动态 SQL :
9 种标签:
<trim>
、<where>
、<set>
、<foreach>
、<if>
、<choose>
、<when>
、otherwise
、<bind>
执行原理:使⽤ OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能
Mybatis 延迟加载:
原理:使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用
a.getB().getName()
拦截器invoke()
发现a.getB()
时 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查上来,然后调用a.setB(b)
,于是 a 的对象 b 属性就有值了,接着完成a.getB().getName()
方法的调用
Mybatis 如何执行批处理:
使用 BatchExecutor 完成批处理。
Mybatis 的 Executor 执行器:
SimpleExecutor
:每执⾏⼀次 update 或 select,就开启⼀个 Statement 对象,⽤完⽴刻关闭Statement 对象ReuseExecutor
:执⾏ update 或 select,以 sql 作为 key 查找 Statement 对象,存在就使⽤,不存在就创建,⽤完后,不关闭 Statement 对象,⽽是放置于 Map内,供下⼀次使⽤。简⾔之,就是重复使⽤ Statement 对象。 BatchExecutor
:执⾏ update(没有 select,JDBC 批处理不⽀持 select),将所有 sql 都添加到批处理中(addBatch()),等待统⼀执⾏(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐⼀执⾏ executeBatch()批处理。与JDBC 批处理相同。在 Mybatis 配置⽂件中,可以指定默认的 ExecutorType 执⾏器类型,也可以⼿动给DefaultSqlSessionFactory 的创建 SqlSession 的⽅法传递 ExecutorType 类型参数。
Mybatis 解析映射文件(如果 A 标签通过 include 引⽤了 B 标签的内容):
Mybatis 解析 A 标签,发现 A 标签引⽤了 B 标签,但是 B 标签尚未解析到,尚不存在, 此时,Mybatis 会将 A 标签标记为未解析状态,然后继续解析余下的标签,包含 B 标签, 待所有标签解析完毕,Mybatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B标签已经存在,A 标签也就可以正常解析完成了。
Mybatis 的 XML 文件和Mybatis 内部数据结构之间的映射关系:
Mybatis 将所有 Xml 配置信息都封装到 All-In-One 重量级对象 Configuration 内部。 在 Xml映射⽂件中:
标签会被解析为 ParameterMap 对象,其每个⼦元素会被解析为ParameterMapping 对象。
标签会被解析为 ResultMap 对象,其每个⼦元素会被解析为 ResultMapping 对象。 - 每⼀个