工具類獲取SqlSesionFactory與SqlSession


/**
 * 通過單例模式,創建一個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();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章