SqlSession构建流程
MyBatis
本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程、SqlSession构建流程、CRUD执行流程、MyBatis扩展点,以及针对面试题进行源码分析。
mybatis 3.x源码深度解析与最佳实践下载:https://download.csdn.net/download/u013425841/12816685
SqlSession构建流程
MyBatis执行的基本流程大致可以分四个步骤:
- 使用Resources类加载Mybatis的Xml配置文件
- 使用SqlSessionFactoryBuilder构建SqlSessionFactory对象
- 使用SqlSessionFactory对象调用openSession获取SqlSession
- 使用SqlSessioon对象调用select\update\delete等方法进行操作
public static void main(String[] args) {
try {
Reader reader;
// 1.加载mybatis configuration配置文件
String resource = "Configuration.xml";
reader = Resources.getResourceAsReader(resource);
// 2.使用SqlSessionFactoryBuilder构建SqlSessionFactory对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 3.构建SqlSession对象
SqlSession session = sessionFactory.openSession();
try {
//4.执行数据库查询
User user = (User) session.selectOne("com.mybatis.source.mapper.UserMapper.getUser", 1);
System.out.println(user.getAge() + "," + user.getName());
} finally {
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
今天重点分析SqlSession的构建流程,主要对应代码
- SqlSession session = sessionFactory.openSession();
进入源码分析:
-
首先调用openSession方法, 内部调用openSessionFromDataSource方法
-
getTransactionFactoryFromEnvironment()方法的作用:
根据环境配置选择事物管理器工厂,本文配置的是JDBC,所以使用的是JdbcTransactionFactory.
-
通过事物管理器工厂newTransaction方法,获取JdbcTransaction事物管理器,底层使用Connection进行事物commit和rollback
-
接下来获取执行器,configuration.newExecutor(tx, execType);
MyBatis一共4选择器,分别是BatchExecutor、ReuseExecutor、SImpleExecutor、CachingExecutor
BatchExecutor:
- 批量执行器,BatchExecutor使用PreparedStatement的addBatch方法批量添加sql语句,之后使用executeBatch一次性提交缓存的sql语句,提高了处理性能.
BatchExecutor处理器,当执行的sql语句是同一个,会像ReuseExecutor处理一样,复用Statement预处理对象,提高性能
ReuseExecutor:
- 复用Statement预处理对象,性能比SimpleExecutor好
SImpleExecutor:
- 简单执行器,没有特别处理,每次开启新的Statement,默认是SimpleExecutor
CachingExecutor:
-
缓存执行器,当开启二级缓存会使用该执行器,CachingExecutor并没有直接继承BaseExcutor,而且通过委托的方式使用上面的执行器去处理逻辑,CachingExecutor则主要关注二级缓存的实现逻辑
-
开启二级缓存的方式
接下来就是执行器的代理创建:
interceptorChain.plugin(executor)方法最终会调用到wrap方法,进行代理创建
我们熟知的PageHelper就是通过实现拦截器,动态拦截sql达到语句的修改
至此openSession的逻辑就结束了,包装到DefaultSqlSession返回
与我联系
Java/一对一零基础辅导/公司项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 微信:study_51ctofx