SqlSessionFactory实现过程
package mybatis.common;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
*单例创建SqlSessionFatory对象
*/
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
init();
}
return sqlSessionFactory.openSession(true);
}
//单例创建sqlSessionFactory对象
private static SqlSessionFactory init() {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
synchronized(SqlSessionFactoryUtil.class) {
if (sqlSessionFactory == null) {
//调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
return sqlSessionFactory;
}
}
}
- 调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法;
public SqlSessionFactory build(InputStream inputStream) {
return this.build((InputStream)inputStream, (String)null, (Properties)null);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
//SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建XMLConfigBuilder 对象 ;
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//调用 XMLConfigBuilder 对象的 parse() 方法 获取 Configuration 对象;
//然后返回一个DefaultSqlSessionFactory
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
}
}
//然后返回一个DefaultSqlSessionFactory
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
总结
SqlSessionFactory对象build()方法创建一个XMLConfigBuilder,通过parse()方法创建Config对象,最后返回DefaultSqlSessionFactory对象也就是SqlSessionFactory对象