MyBatis 源码分析篇 2:SqlSession

SqlSession 接口提供数据库执行的所有方法(增删改查、提交、回滚等),在这里我们重点讨论其实现类 DefaultSqlSession。

对于数据库操作的具体实现为下图红框标出的五个方法,其余方法皆调用这五个方法来实现:

MyBatis 源码分析篇 2:SqlSession_第1张图片
DefaultSqlSession Structure

例如,该类中所有的 selectOne 方法、selectMap 方法和其他的 selectList 均调用 selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds) 实现;所有的 insert、delete 及其余 update 均调用
update(java.lang.String, java.lang.Object) 实现,具体可查看源码。

这种处理方式值得我们在实际开发中借鉴:通过改变参数传递调用已有方法,使代码脉络清晰,从而以达到简化代码的目的。

另外需要注意的是两个成员变量:configurationexecutor

private final Configuration configuration;
private final Executor executor;

public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
    this.configuration = configuration;
    this.executor = executor;
    this.dirty = false;
    this.autoCommit = autoCommit;
}
  • configuration 负责获取配置信息,如 Mapper 接口、映射语句、ObjectFactory、ObjectWrapperFactory、ReflectorFactory 等。如:
  @Override
  public  T getMapper(Class type) {
    return configuration.getMapper(type, this);
  }
  • SqlSession 将数据库执行的具体操作委托给了 Executor 来实现,如 selectList 方法:
  @Override
  public  List 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();
    }
  }

附:

当前版本:mybatis-3.5.0
官网文档:MyBatis
项目实践:MyBatis Learn
手写源码:MyBatis 简易实现

你可能感兴趣的:(MyBatis 源码分析篇 2:SqlSession)