mybatis源代码分析(一)


mybatis源代码分析(一)

在近两年的工作中一直是在适用的是mybatis框架,进行数据库的相关操作。这次来进行对mybatis源代码的一个学习。回想一下第一份工作时还使用的是ibatis,着实有一些岁月了。下面来一步一步的进行分析

调试环境的搭建

参照芋大的代码,在设置maven的时候需要指定中央仓库这样稍微快一点

使用org.apache.ibatis.autoconstructor.AutoConstructorTest进行测试,也可以查看github上的源代码地址

核心基础组件

核心的基础组件:SqlSessionFactory和SqlSession,Configuration,Executor,MapperProxyFactory和MapperProxy,Plugin

这四大组件是注册Mybatis框架重要的基础组件,下面就详细来进行分析;

  1. SqlSession是抽象处理出来为JDBC生成的Connection对象的SqlSession对象,这样才能与数据库开启“沟通”,通过SqlSession可以实现增删改查的接口

JEVXRK.png

  • 默认实现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对象的构造方法中传入的。继续延着调用链查看调用者

  1. 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时进行分析该方法。

  1. SqlSessionManager是组合SqlSessionSqlSessionFactory的工具类。通过这个类可以直接对数据库进行操作。该类会复用SqlSessionManager的localSqlSession的逻辑。

  TOC