在当今Java持久层框架生态中,MyBatis凭借其灵活的SQL控制能力和简洁的ORM实现成为企业级应用的首选。与JPA的全自动ORM不同,MyBatis采用半自动化映射理念,在保持SQL灵活性的同时,通过智能映射减少70%的JDBC样板代码。
本文将深入剖析MyBatis的架构核心,通过源码解析揭示其内部工作机制。阅读本文后,您将掌握:
public class SqlSessionFactoryBuilder {
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
public SqlSessionFactory build(InputStream inputStream) {
return build(inputStream, null, null);
}
.....
}
DefaultSqlSessionFactory
public class DefaultSqlSessionFactory implements SqlSessionFactory {
private final Configuration configuration;
public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}
@Override
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
......
}
DefaultSqlSession
public class DefaultSqlSession implements SqlSession {
private final Configuration configuration;
private final Executor executor;
private final boolean autoCommit;
private boolean dirty;
private List<Cursor<?>> cursorList;
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
this.configuration = configuration;
this.executor = executor;
this.dirty = false;
this.autoCommit = autoCommit;
}
public DefaultSqlSession(Configuration configuration, Executor executor) {
this(configuration, executor, false);
}
@Override
public <T> T selectOne(String statement) {
return this.selectOne(statement, null);
}
......
}
类型 | 特点 | 适用场景 |
---|---|---|
SimpleExecutor | 每次执行创建新Statement | 常规操作 |
ReuseExecutor | 复用预处理Statement | 高频相同SQL操作 |
BatchExecutor | 批量操作优化 | 大批量数据插入/更新 |
PreparedStatementHandler
public Configuration parse() {
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
private void parseConfiguration(XNode root) {
propertiesElement(root.evalNode("properties"));
typeAliasesElement(root.evalNode("typeAliases"));
pluginsElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
settingsElement(root.evalNode("settings"));
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
}
// XMLMapperBuilder.java
private void configurationElement(XNode context) {
String namespace = context.getStringAttribute("namespace");
// 解析缓存配置
cacheRefElement(context.evalNode("cache-ref"));
cacheElement(context.evalNode("cache"));
// 解析SQL片段
sqlElement(context.evalNodes("/mapper/sql"));
// 解析CRUD操作
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
}
// DefaultSqlSessionFactory.java
private SqlSession openSessionFromDataSource(ExecutorType execType,
TransactionIsolationLevel level,
boolean autoCommit) {
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
}
// DefaultParameterHandler.java
public void setParameters(PreparedStatement ps) {
for (int i = 0; i < parameterMappings.size(); i++) {
ParameterMapping parameterMapping = parameterMappings.get(i);
Object value;
String property = parameterMapping.getProperty();
// 获取参数值(支持复杂对象导航)
value = parameterMapping.getTypeHandler().getParameter(parameterObject, property);
// 设置到PreparedStatement
typeHandler.setParameter(ps, i + 1, value, jdbcType);
}
}
// DefaultResultSetHandler.java
public List<Object> handleResultSets(Statement stmt) throws SQLException {
final List<Object> multipleResults = new ArrayList<>();
ResultSetWrapper rsw = getFirstResultSet(stmt);
// 遍历结果集
while (rsw != null) {
// 处理单结果集
Object resultObject = handleResultSet(rsw, resultMaps);
multipleResults.add(resultObject);
rsw = getNextResultSet(stmt);
}
return collapseSingleResultList(multipleResults);
}
// 正确用法:确保资源释放
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.findById(101);
// 业务处理...
} // 自动关闭session
场景 | 推荐执行器 | 配置方式 |
---|---|---|
常规单条操作 | SimpleExecutor | 默认配置 |
批量更新操作 | BatchExecutor | openSession(ExecutorType.BATCH) |
高并发重复SQL | ReuseExecutor | openSession(ExecutorType.REUSE) |
问题场景:
<cache/>
解决方案:
<cache type="org.apache.ibatis.cache.TransactionalCache"/>
本文深入剖析了MyBatis的核心架构与运行机制,关键要点包括:
SqlSessionFactory
、Executor
、StatementHandler
的协作关系Configuration
对象构建过程