mybatis源代码分析(一)
在近两年的工作中一直是在适用的是mybatis框架,进行数据库的相关操作。这次来进行对mybatis源代码的一个学习。回想一下第一份工作时还使用的是ibatis,着实有一些岁月了。下面来一步一步的进行分析
调试环境的搭建
参照芋大的代码,在设置maven的时候需要指定中央仓库这样稍微快一点
使用org.apache.ibatis.autoconstructor.AutoConstructorTest进行测试,也可以查看github上的源代码地址
核心基础组件
核心的基础组件:SqlSessionFactory和SqlSession,Configuration,Executor,MapperProxyFactory和MapperProxy,Plugin
这四大组件是注册Mybatis框架重要的基础组件,下面就详细来进行分析;
- SqlSession是抽象处理出来为JDBC生成的Connection对象的SqlSession对象,这样才能与数据库开启“沟通”,通过SqlSession可以实现增删改查的接口
- 默认实现DefaultSqlSession
@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
从上面的代码可以看出,sql的执行是交给了executor对象去执行的,该对象是SqlSession的一个属性。该属性是在SqlSession对象的构造方法中传入的。继续延着调用链查看调用者
- SqlSessionFactory是获取SqlSession的的接口
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
从上述代码中可以看到executor对象是通过comfiguration对象获取到的。稍后分析connfiguration时进行分析该方法。
- SqlSessionManager是组合SqlSession和SqlSessionFactory的工具类。通过这个类可以直接对数据库进行操作。该类会复用SqlSessionManager的localSqlSession的逻辑。