/**
* 通過單例模式,創建一個sqlSessionFactory
* @author zomas
*/
public class MyBatisSqlSessionFactory {
private static final String LOCATION="mybatis-config.xml";//MyBatis框架的總體配置文件
//懶漢式單例模式(SqlSessionFactory一個應用裏面只有一個所以最好這裏使用單例模式)
private static SqlSessionFactory sqlSessionFactory=null;
private MyBatisSqlSessionFactory(){}
//初始化SqlSessionFactory對象
private static void init(){
//加載配置文件(將配置文件加載到內存變爲輸入流)
InputStream inputStream = null;
try {//利用MyBatis封裝的工具類的getResourceAsStream方法本質還是利用類加載器進行加載文件
//獲得了一個輸入流(包含數據庫的連接數據)
inputStream = Resources.getResourceAsStream(LOCATION);
} catch (IOException e) {
System.out.println("Mybatis加載配置文件時失敗");
e.printStackTrace();
}
//通過SqlSessionFactoryBuilder對象來創建SqlSessionFactory工廠(這裏使用創建者模式)
//SqlSessionFactoryBuilder是SqlSessionFactory生成器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//builder對象在創建SqlSessionFactory對象時,需要連接數據庫的配置信息
//(所有的配置信息都在mybatis-config.xml中這個文件已經被轉換成了輸入流所以直接)
//利用build方法創建了sqlSessionFactory
sqlSessionFactory=builder.build(inputStream);
}
//線程同步(防止出現線程不安全問題)
//因爲是單例模式
//獲取sqlSessionFactory對象
/*
也就是說每個線程都來獲取SessionFactory對象
爲了防止一個線程運行一半被半路上攔下不讓走所以加上synchronized讓其一個線程走完在讓下一個走
下面的方法獲取工廠類
if判斷是爲了如果爲null就創建,如果不是null就直接返回對象
*/
public static synchronized SqlSessionFactory getSqlSessionFactory(){
//進行判斷是不是空是空就創建一個不是就直接返回,爲了防止sqlSessionFactory直接返回的是個null
if (sqlSessionFactory==null){
//初始化SqlSessionFactory對象
init();
}
return sqlSessionFactory;
}
//獲取sqlSession對象
public static SqlSession getSqlSession(){
//不能直接用sqlSessionFactory變量調用
//因爲如果是null就會報空指針所以用get方法調用
return getSqlSessionFactory().openSession();
}
}