SqlSession 接口提供数据库执行的所有方法(增删改查、提交、回滚等),在这里我们重点讨论其实现类 DefaultSqlSession。
对于数据库操作的具体实现为下图红框标出的五个方法,其余方法皆调用这五个方法来实现:
例如,该类中所有的 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) 实现,具体可查看源码。
这种处理方式值得我们在实际开发中借鉴:通过改变参数传递调用已有方法,使代码脉络清晰,从而以达到简化代码的目的。
另外需要注意的是两个成员变量:configuration 和 executor。
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> T getMapper(Class<T> type) {
return configuration.<T>getMapper(type, this);
}
- SqlSession 将数据库执行的具体操作委托给了 Executor 来实现,如 selectList 方法:
@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();
}
}
附:
当前版本:mybatis-3.5.0
官网文档:MyBatis
项目实践:MyBatis Learn
手写源码:MyBatis 简易实现