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 仅可以编写针对 ParameterHandlerResultSetHandlerStatementHandlerExecutor 这四个接口的插件 Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandlerinvoke() 方法

    编写插件:

    1. 实现 Mybatis 的 Interceptor 接口并实现 intercept() 方法,
    2. 给插件编写注解,指定要拦截哪一个接口的哪些方法
    3. 在配置文件种配置插件

    动态 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 对象。

    • 每⼀个