引言
MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。本文将深入探索 MyBatis 的核心源码,揭示其持久层技术的奥秘。
MyBatis 的架构
MyBatis 的架构可以分为以下几个核心组件:
- SqlSessionFactoryBuilder: 用于构建 SqlSessionFactory。
- SqlSessionFactory: 用于创建 SqlSession。
- SqlSession: 用于执行 SQL 命令,管理事务。
- Executor: 执行器,负责执行 SQL 命令。
- MappedStatement: 代表一个映射语句,包含 SQL 语句和参数映射。
- ParameterObject: 代表 SQL 语句的参数。
MyBatis 的初始化过程
当 MyBatis 应用启动时,会经历以下初始化过程:
- 加载配置文件: MyBatis 会读取配置文件(XML 或注解),解析出 SqlSessionFactoryBuilder。
- 构建 SqlSessionFactory: SqlSessionFactoryBuilder 会根据配置文件构建 SqlSessionFactory。
- 创建 SqlSession: SqlSessionFactory 用于创建 SqlSession。
- 执行 SQL 命令: 通过 SqlSession 执行 SQL 命令。
源码分析
SqlSessionFactoryBuilder
public SqlSessionFactory build(InputStream inputStream) throws IOException {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, resource, environment, properties);
return build(parser.parse());
}
public SqlSessionFactory build(XNode root) {
try {
Configuration configuration = new Configuration();
parseConfiguration(configuration, root);
return new DefaultSqlSessionFactory(configuration);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
}
}
SqlSessionFactory
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
<T> T getMapper(Class<T> type);
}
SqlSession
public interface SqlSession extends Closeable {
<T> T selectOne(String statement, Object parameter);
<E> List<E> selectList(String statement, Object parameter);
<K, V> Map<K, V> selectMap(String statement, String mapKey, Object parameter);
<T> Cursor<T> selectCursor(String statement, Object parameter);
<T> List<T> selectList(String statement);
<T> T selectOne(String statement);
<K, V> Map<K, V> selectMap(String statement, String mapKey);
void select(String statement, ResultHandler handler);
void select(String statement, Object parameter, ResultHandler handler);
void update(String statement, Object parameter);
void delete(String statement, Object parameter);
void insert(String statement, Object parameter);
void commit();
void rollback();
void close();
}
Executor
public interface Executor {
<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler);
int update(MappedStatement ms, Object parameter);
void commit(ExecutorType execType);
void rollback(ExecutorType execType);
}
MappedStatement
public interface MappedStatement {
String getId();
SqlSource getSqlSource(Configuration configuration);
Cache getCache();
ResultMap getResultMap();
List<ParameterMapping> getParameterMappings();
List<ResultMapping> getResultMappings();
boolean hasKeyGenerator();
KeyGenerator getKeyGenerator();
SqlCommandType getSqlCommandType();
}
总结
通过以上源码分析,我们可以了解到 MyBatis 的核心组件及其工作原理。MyBatis 通过抽象和封装 JDBC 代码,简化了数据库操作,提高了开发效率。深入了解 MyBatis 的源码,有助于我们更好地使用这个优秀的持久层框架。
