mybatis源码解析
整体架构
基础支持层
反射、类型、日志、io、解析器、数据源、事务、缓存、Binding、注解、异常
以后细看
核心处理层
配置解析
mybatis-config.xml 解析~
Mapper.xml 配置文件解析~
SQL解析
~
SQL执行
~
插件、
接口层
SqlSession 接口~
MyBatis 编程步骤
- 创建 SqlSessionFactory 对象。
- 通过 SqlSessionFactory 获取 SqlSession 对象。
- 通过 SqlSession 获得 Mapper 代理对象。
- 通过 Mapper 代理对象,执行数据库操作。
- 执行成功,则使用 SqlSession 提交事务。
- 执行失败,则使用 SqlSession 回滚事务。
- 最终,关闭会话。
动态sql其执行原理为,使用 OGNL 的表达式,从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL ,以此来完成动态 SQL 的功能。
Mapper 接口的实现类,通过 MyBatis 使用 JDK Proxy 自动生成其代理对象 Proxy ,而代理对象 Proxy 会拦截接口方法,从而“调用”对应的 MappedStatement 方法,最终执行 SQL ,返回执行结果
Mapper 接口里的方法,是不能重载的,因为是全限名 + 方法名的保存和寻找策略。
Mybatis 有四种 Executor 执行器,分别是 SimpleExecutor、ReuseExecutor、BatchExecutor、CachingExecutor 。
- SimpleExecutor :每执行一次 update 或 select 操作,就创建一个 Statement 对象,用完立刻关闭 Statement 对象。
- ReuseExecutor :执行 update 或 select 操作,以 SQL 作为key 查找缓存的 Statement 对象,存在就使用,不存在就创建;用完后,不关闭 Statement 对象,而是放置于缓存
Map<String, Statement>
内,供下一次使用。简言之,就是重复使用 Statement 对象。 - BatchExecutor :执行 update 操作(没有 select 操作,因为 JDBC 批处理不支持 select 操作),将所有 SQL 都添加到批处理中(通过 addBatch 方法),等待统一执行(使用 executeBatch 方法)。它缓存了多个 Statement 对象,每个 Statement 对象都是调用 addBatch 方法完毕后,等待一次执行 executeBatch 批处理。实际上,整个过程与 JDBC 批处理是相同。
- CachingExecutor :在上述的三个执行器之上,增加二级缓存的功能。
在 Mybatis 配置文件中,可以配置 <setting name="lazyLoadingEnabled" value="true" />
来启用延迟加载的功能。默认情况下,延迟加载的功能是关闭的。
编写一个 MyBatis 插件的步骤如下:
- 首先,实现 Mybatis 的 Interceptor 接口,并实现
#intercept(...)
方法。 - 然后,在给插件编写注解,指定要拦截哪一个接口的哪些方法即可
- 最后,在配置文件中配置你编写的插件。
Mybatis 的 XML 映射文件和 Mybatis 内部数据结构之间的映射关系
Mybatis 将所有 XML 配置信息都封装到 All-In-One 重量级对象Configuration内部
评论