SqlSession构建流程
MyBatisSqlSession构建流程与我联系MyBatis
本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程、SqlSession构建流程、CRUD执行流程、MyBatis扩展点,以及针对面试题进行源码分析。
mybatis 3.x源码深度解析与最佳实践下载:/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