1 DefaultSqlSessionFactory
SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession
SqlSessionFactoryBuilder
- XMLConfigBuilder 解析XML
- Configuration 存储配置信息,按需创建对象,贯穿MyBatis整个执行流程
1.1 实例化 XMLConfigBuilder
new XMLConfigBuilder(inputStream, environment, properties);
===> XMLConfigBuilder
- 在这个过程中实例化 XPathParser、Document
1.2 实例化 Configuration
parser.parse()
===> Configuration
XMLConfigBuilder parser ---- prase()
XPathParser parser ---- evalNode()
(在实例化XMLConfigBuilder的时候已经创建好)
1.3 实例化 DefaultSqlSessionFactory
build(parser.parse());
===> DefaultSqlSessionFactory
SqlSessionFactory
public interface SqlSessionFactory {
SqlSession openSession();
// ...
// openSession 的各种重载 略
// ...
Configuration getConfiguration();
}
DefaultSqlSessionFactory
实现了 SqlSessionFactory 接口的 openSession 方法
openSession—> openSessionFromConnection / openSessionFromDataSource
2 DefaultSqlSession
2.1 SqlSession
- SqlSession 只是一个门面 真正执行操作的是Executor
- 定义数据库的操作:可以直接执行增、删、改、查
- 获取 Mapper 通过Mapper操作数据库
- 事务管理
- 缓存管理
public interface SqlSession extends Closeable {
/**
* Retrieve a single row mapped from the statement key.
*/
<T> T selectOne(String statement);
<T> T selectOne(String statement, Object parameter);
<E> List<E> selectList(String statement);
<E> List<E> selectList(String statement, Object parameter);
<E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
<K, V> Map<K, V> selectMap(String statement, String mapKey);
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
<T> Cursor<T> selectCursor(String statement);
<T> Cursor<T> selectCursor(String statement, Object parameter);
<T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
void select(String statement, Object parameter, ResultHandler handler);
void select(String statement, ResultHandler handler);
void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
int insert(String statement);
int insert(String statement, Object parameter);
int update(String statement);
int update(String statement, Object parameter);
int delete(String statement);
int delete(String statement, Object parameter);
// 事务
void commit();
void commit(boolean force);
void rollback();
void rollback(boolean force);
List<BatchResult> flushStatements();
@Override
void close();
// 缓存
void clearCache();
Configuration getConfiguration();
// mapper
<T> T getMapper(Class<T> type);
Connection getConnection();
}
2.2 创建 DefaultSqlSession
openSession—> openSessionFromConnection / openSessionFromDataSource
2.2.1 配置事务管理器 Transaction
Transaction tx = null;
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
2.2.2 Environment
数据库环境的配置信息,包含了事务管理器 transactionManager 和数据源 DataSource 信息。
final Environment environment = configuration.getEnvironment();
2.2.3 Transaction
2.2.4 实际执行SQL的是Executor
3 Mapper代理
3.1 SqlSession使用方式
- 读取xml
String resource = "resource/mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
- 创建SqlSessionFactory
- 打开Session
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
① 通过Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser("xxx");
② 直接调用
User user = sqlSession.selectOne("mapper里sql方法的绝对路径 xxx.xxx.mapper.getUser");
3.2 getMapper 返回的是Mapper的代理类
SqlSession —> Configuration—>MapperRegistry—>MapperProxyFactory—>MapperProxy
3.3 MapperProxy
3.3.1 MapperProxyFactory 创建代理对象的工厂类
- (MapperRegistry)以SQlSession为参数,创建 MapperProxy
- 用MapperProxy 代理 Mapper,这样在调用Mapper接口方法的时候,实际上是调用代理类的方法,最终通过SqlSession 和 数据库进行交互
3.3.2 invoke方法 MapperProxy —> MapperMethod
3.3.3 MapperMethod —> SqlSession
所以执行过程为
Mapper接口 —> MapperRegistry —> MapperProxyFactory —> MapperProxy —> SqlSession —> Executor —> StatementHandler —> Statement