前言
MyBatis 是一个被广泛应用的持久化框架. 一个简单的使用示例如下所示, 先创建会话工厂, 然后从会话工厂中打开会话, 通过 class 类型和配置生成 Mapper 接口的代理实现, 最后使用 Mapper 进行持久化操作.
本文将从 MyBatis 中的 SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession 和 Mapper 几个方面入手简单分析 MyBatis 的实现原理. 在后面的系列文章中会进一步具体分析核心类的细节实现.
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 使用 Builder 模式去生成 SqlSessionFactory, 因此只提供了多个 build 方法. 这些方法可以接受 xml 配置文件的 Reader 或 InputStream 输入流, 也可以传入 environment 指定环境或传入 Properties 作为属性.
在 build 方法的实现中, 首先根据传入的输入流, environment 和 Properties 构建 XMLConfigBuilder 对象, 然后调用其 parse() 方法解析 xml 文件得到 Configuration 对象, 最后创建 SqlSessionFactory 对象并返回.
SqlSessionFactory
SqlSessionFactory 是一个工厂接口, 默认实现是 DefaultSqlSessionFactory.SqlSessionFactory 的作用是获取 SqlSession, 因此提供了多个 openSession 方法, 支持从 DataSource 数据源和一个给定的连接 Connection 中创建 SqlSession.
openSession 方法的底层实现可以分为 5 步:
1从 Configuration 对象中获取环境配置 Environment;
2根据环境配置得到事务工厂 TransactionFactory;
3从事务工厂得到事务 Transaction,Transaction 包装了数据库连接, 处理数据库连接的创建, 准备, 提交, 回滚和关闭;
4创建执行器 Executor;
5创建 SqlSession, 返回 DefaultSqlSession 的实例.
其中从 DataSource 数据源创建 SqlSession 的过程如下所示:
SqlSession
SqlSession 是一个接口, 默认实现是 DefaultSqlSession, 提供了多种数据库操作方式, 如 select,selectOne,selectList,insert,update,delete,commit,rollback 和 getMapper 等方法. getMapper 方法用于获取 Mapper 接口的代理实现. 在 MyBatis 中建议使用 Mapper 接口操作数据库.
数据库的增删改查和事务的提交回滚都是通过 Executor 执行的. Executor 有 3 种类型 SIMPLE,REUSE,BATCH, 默认使用简易执行器 SIMPLE,REUSE 类型执行器重用预处理语句, BATCH 类型执行器重用预处理语句和批量更新. Executor 对象的创建在 Configuration 类型的 newExecutor 方法中进行.
来源: http://www.jianshu.com/p/7f3019043166