Mybatis的工厂类的编写

问题:如果每次都要读取配置文件,再去创建工厂,而后再取得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();
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq1019648709/article/details/80897203