SqlSession是Mybatis的一个核心类,简单点就是执行sql的,Mybatis的一级缓存应该就在这个级别上的,实际上一级缓存在Executor中实现的,下个文章介绍。
先看看SqlSession中的方法:
对数据库的操作在这个接口中应该都包括了,还有对事务的操作。SqlSession的实现类现在就一个DefaultSqlSession。这个类的实例是从SqlSessionFacotry中创建的,上一个文章说过。
这个实现类的构造方法有几个参数说明一下,
configuration框架级别的配置类,executor是Sql执行器,autoCommit是否自动提交。
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
this.configuration = configuration;
this.executor = executor;
this.dirty = false;
this.autoCommit = autoCommit;
}
再看一下这个类的select方法,实际上是委托给executor执行。其实对数据的CRUD和对事物的提交和回滚都是委托给executor执行的。
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();
}
}
public void commit(boolean force) {
try {
executor.commit(isCommitOrRollbackRequired(force));
dirty = false;
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error committing transaction. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
public void rollback(boolean force) {
try {
executor.rollback(isCommitOrRollbackRequired(force));
dirty = false;
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error rolling back transaction. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
下文简析Executor。。。。。
领取专属 10元无门槛券
私享最新 技术干货