String xml ="spring-mybatis.xml";
Reader reader = Resources.getResourceAsReader(xml);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = build.openSession();
首先调用sqlSessionFactoryBuilder中的build方法去读取mybatis的配置文件,获得一个DefaultSqlSessionFactory。
public SqlSessionFactory build(Reader reader) {
return this.build((Reader)reader, (String)null, (Properties)null);
}
//真实的build方法
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
//通过XMLconfigBuilder来解析mybatis配置
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
//关键部分在这里,调用了build方法返回了SqlSessionFactory对象
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
}
}
return var5;
}
//上面调用的build方法
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
获得SqlSessionFactory之后,通过openSession方法来获得SqlSession对象。
public interface SqlSessionFactory {
SqlSession openSession();
上面说了,表面上我们使用的是SqlSessionFactory实际上,我们调用的是DefaultSqlSessionFactory中的openSession方法。
//DefaultSqlSessionFactory中的openSession方法
public SqlSession openSession() {
//调用了openSessionFromDataSource方法
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}
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);
//表面上我们使用sqlSession执行sql,实际上,使用的是excutor执行, excutor是对于Statement的封装。
Executor executor = this.configuration.newExecutor(tx, execType);
//关键,创建了一个DefaultSqlSession对象
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;
}
这样,我们就到了SqlSession对象了,就能执行sql语句了。
总结一下:
第一步,调用sqlSessionFactoryBuilder中的build方法去读取mybatis的配置文件,获得一个DefaultSqlSessionFactory。
解析mybatis文件是通过XMLconfigBuilder来实现的,通过调用XMLconfigrationBuilder对象的parse方法来调用parseConfiguration方法对mybatis文件中的各个节点和根节点进行解析。将解析完成的Configration丢给build方法去创建一个
DefaultSqlSessionFactory对象,返回完成操作。
第二步,获得SqlSessionFactory之后,通过openSession方法来获得SqlSession对象。上面提到,SqlSessionFactory得到实际是DefaultSqlSessionFactory,那么调用的openSession也是DefaultSqlSessionFactory对象的openSession方法。然后openSession方法调用openSessionFromDataSource方法来获取Environment 、TransactionFactory 、Executor 等对象属性,最后创建一个DefaultSqlSession对象返回。至此,SqlSession对象就创建完成。