在上一篇中,说到了mybatis是如何构造一个SqlSessionFactory实例的,顾名思意,SqlSessionFactory就是用于创建SqlSession的工厂类。
好,现在我们接着昨天的来,mybatis框架解析完xml配置文件之后,将其封装成一个Configuration实例,然后,SqlSessionFactory拿着这个Configuration实例,就可以创建SqlSession了。mybatis框架中,默认的实现是DefaultSqlSessionFactory。
下来,我们跟着源码来逐步分析, 还是从测试代码开始走起。
测试代码
public class V1Test { public static void main(String[] args) { try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml")) { SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(true); FemaleMapper femaleMapper = sqlSession.getMapper(FemaleMapper.class); Female female = femaleMapper.getFemaleById(1); System.out.println(female); } catch (Exception e) { e.printStackTrace(); } } }
前面已经分析了SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is)这一行代码了, 今天咱们从SqlSession sqlSession = sqlSessionFactory.openSession(true)这一行代码说起。
(1) DefaultSqlSessionFactory.java
这一行代码上戳个断点,debug启动测试代码,很是直观的看到sqlSessionFactory的真实类型就是DefaultSqlSessionFactory类型,跟代码,就会看下面这段核心代码,
代码的具体功能,注释已说明了。
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { // Environment 封装了数据库相关的信息 final Environment environment = configuration.getEnvironment(); // 事务工厂类 final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); // 新建一个事务 tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); // 创建一个执行器,就是它与底层数据库打交道,CRUD,提交事务,回滚事务啥的 final Executor executor = configuration.newExecutor(tx, execType); // 创建一个SqlSession,并返回 return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) { }
mybatis构造SqlSession对象就这么几步,还是很简单的。
总结:
1. mybatis默认使用DefaultSqlSessionFactory工厂来创建SqlSession对象
2. mybatis从configuration对象中拿到数据库相关的环境信息,然后构造一个合适的事务工厂类,默认是JdbcTransactionFactory, 由于创建connection事务
3. mybatis 会构造一个Executor执行器,使用它与数据库打交道。
4. SqlSession持有了一个Executor实例,可以理解为对Executor功能的增强,有些装饰模式的意思吧!
5. 下面是个简易的流程图