介紹一下Mybatis中幾個關鍵對象的做用和生命週期,參考Mybatis官方介紹文檔。sql
SqlSessionFactoryBuilder
用來建立SqlSessionFactory的,一旦建立完SqlSessionFactory實例以後,這個類就不須要存在了,因此能夠把它做爲一個局部變量使用。安全
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory
SqlSessionFactory是單例的,會隨着應用的生命週期一同存在,而且同時只存在一個對象實例。session
SqlSession
每一個線程都有它本身的SqlSession實例,SqlSession實例不能被共享,也不是線程安全的。因此它的生命週期是request或者局部的。絕對不能將 SqlSession 實例的引用放在一個 類的靜態字段甚至是實例字段中。 也毫不能將 SqlSession 實例的引用放在任何類型的管理範 圍中, 好比 Serlvet 架構中的 HttpSession。關閉 Session 很重要,你應該確保使 用 finally 塊來關閉它。下面的示例就是一個確保 SqlSession 關閉的基本模式:mybatis
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }
Mapper 實例
映射器是你建立綁定映射語句的接口。映射器接口的實例能夠從 SqlSession 中得到。那 麼從技術上來講,當被請求時,任意映射器實例的最寬範圍和 SqlSession 是相同的。然而, 映射器實例的最佳範圍是方法範圍。也就是說,它們應該在使用它們的方法中被請求,而後 就拋棄掉。它們不須要明確地關閉,那麼在請求對象中保留它們也就不是什麼問題了,這和 SqlSession 類似。你也許會發現,在這個水平上管理太多的資源的話會失控。保持簡單,將 映射器放在方法範圍內。下面的示例就展現了這個實踐:架構
SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }