问题:如果每次都要读取配置文件,再去创建工厂,而后再取得SqlSession这样的话代码存在太多的重复,那么我们希望编写一个工厂类来封装此操作,同时添加关闭的操作;
package cn.zwb.dbc;
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;
public class MyBatisSessionFactory {
//用ThreadLocal来处理对象的引用问题
private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlf;
private static InputStream in;//读取[配置文件
static{
try {
in=Resources.getResourceAsStream("mybatis.cfg.xml");
sqlf=new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSession(){
SqlSession sqlSession=(SqlSession)threadLocal.get();
if(sqlSession==null){
if(sqlf==null){
rebuildSessionFactory();
}
sqlSession=(sqlf!=null)?sqlf.openSession():null;
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession(){
SqlSession sqlSession=(SqlSession)threadLocal.get();
threadLocal.set(null);
if(sqlSession!=null){
sqlSession.close();
}
}
private static void rebuildSessionFactory() {
try {
in=Resources.getResourceAsStream("mybatis.cfg.xml");
sqlf=new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}