mybatis如何管理session(Mybatis开发-SqlSession创建过程)
mybatis如何管理session(Mybatis开发-SqlSession创建过程)然后会创建一个DefaultSqlSession的实例,构造方法中传入Configuration、Executor 和 autoCommit的值具体创建过程:Mybatis开发 - Executor的创建及作用接下来详细查看openSession()方法,方法返回一个SqlSession对象,没有输入参数方法中会调用openSessionFromDataSource方法,传入的出参数ExecutorType从Configuration对象中获取,TransactionIsolationLevel为null,autoCommit默认为false;该方法不会自动提交,如果需要自动提交则可调用openSession(true)方法 public SqlSession openSession() { return this.openSessionFromDataSource(th
1.Myabtis中SqlSession的使用SqlSession是通过SqlSessionFactory创建的,创建后可以执行一系列的数据库操作,如果不是自动提交且执行了数据库DML语句,需要手动执行commit方法,在使用完后需要将SqlSession显式关闭。
SqlSession session = null;
try {
...
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
session = factory.openSession();
...
session.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(session != null) {
session.close();
}
}
2.SqlSessionFactory创建SqlSession
SqlSessionFactory是一个接口,定义了一系列的生成SqlSession的方法
SqlSessionFactory类方法
SqlSessionFactory的默认实现是DefaultSqlSessionFactory,DefaultSqlSessionFactory类里面包含了一个Configuration对象,它是通过解析Mybatis配置文件后生成的对象
接下来详细查看openSession()方法,方法返回一个SqlSession对象,没有输入参数
方法中会调用openSessionFromDataSource方法,传入的出参数ExecutorType从Configuration对象中获取,TransactionIsolationLevel为null,autoCommit默认为false;该方法不会自动提交,如果需要自动提交则可调用openSession(true)方法
public SqlSession openSession() {
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType() (TransactionIsolationLevel)null false);
}
2.1Executor对象创建
在openSessionFromDataSource方法中,会通过Configuration对象获取Environment等信息来创建Executor对象
具体创建过程:Mybatis开发 - Executor的创建及作用
然后会创建一个DefaultSqlSession的实例,构造方法中传入Configuration、Executor 和 autoCommit的值
private SqlSession openSessionFromDataSource(ExecutorType execType TransactionIsolationLevel level boolean autoCommit) {
Transaction tx = null;
DefaultSqlSession var8;
try {
Environment environment = this.configuration.getEnvironment();
TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource() level autoCommit);
Executor executor = this.configuration.newExecutor(tx execType);
var8 = new DefaultSqlSession(this.configuration executor autoCommit);
} catch (Exception var12) {
this.closeTransaction(tx);
throw ExceptionFactory.wrapException("Error opening session. Cause: " var12 var12);
} finally {
ErrorContext.instance().reset();
}
return var8;
}
3.DefaultSqlSession对象创建
DefaultSqlSession是SqlSession的默认实现类
在构造方法中,传入Configuration、Executor和autoCommit对象进行赋值
public class DefaultSqlSession implements SqlSession {
private final Configuration configuration;
private final Executor executor;
private final boolean autoCommit;
private boolean dirty;
private List<Cursor<?>> cursorList;
public DefaultSqlSession(Configuration configuration Executor executor boolean autoCommit) {
this.configuration = configuration;
this.executor = executor;
this.dirty = false;
this.autoCommit = autoCommit;
}
...
}
SqlSession是一个接口,在接口中定义了一系列数据库操作方法
SqlSession的默认实现类是DefaultSqlSession,在创建过程中,主要通过配置文件对应的Configuration对象来创建Executor对象,然后将Configuration、Executor和autoCommit通过构造方法进行赋值