作用
SqlSessionFactoryBuilder 的作用在于创建SqlSessionFactory,创建成功后就失去了作用,所以它只能作用于创建SqlSessionFactory方法中,它的最佳的生命周期是方法级别的
使用
public class UserTest {
private final static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
System.out.println(e.getMessage());
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
@Test
public void test1(){
SqlSession sqlSession = sqlSessionFactory.openSession();
final UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
final UserInfo userInfo = mapper.selectByPrimaryKey(3L);
System.out.println(userInfo.getName());
sqlSession.close();
}
}
源码
SqlSessionFactoryBuilder 有 9个重载的方法
上面例子中使用的是 build(Reader reader) 这个方法,但这个方法最终调用的还是 build(Reader reader, String environment, Properties properties) ,代码如下
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
// 配置文件解析 获取到Configuration对象 返回SqlSessionFactory
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
不管哪个build()方法,最终调用的都是build(Configuration config) 来解析配置文件
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
SqlSessionFactoryBuilder 的内容就这些,剩下的都交给了SqlSessionFactory 。