Mybatis知識小匯(4)——作用域(Scope)和生命週期、ResultMap結果對映集
阿新 • • 發佈:2021-02-17
技術標籤:mybatis
文章目錄
作用域(Scope)和生命週期
生命週期和作用域是至關重要的,因為錯誤的使用會導致非常嚴重的併發問題。
SqlSessionFactoryBuilder
- 這個類可以被例項化、使用和丟棄,一旦建立了 SqlSessionFactory,就不再需要它了。
- 因此 SqlSessionFactoryBuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數
- 你可以重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 例項,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。
SqlSessionFactory
可以想象成資料庫連線池
- SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項。
- 使用 SqlSessionFactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建SqlSessionFactory 被視為一種程式碼“壞習慣”。
- 因此SqlSessionFactory 的最佳作用域是應用作用域
- 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。
SqlSession
可以想象成連線到連線池的請求
- 每個執行緒都應該有它自己的 SqlSession 例項。
- SqlSession的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。
- 絕對不能將 SqlSession 例項的引用放在一個類的靜態域,甚至一個類的例項變數也不行。也絕不能將 SqlSession 例項的引用放在任何型別的託管作用域中,比如 Servlet 框架中的 HttpSession。
- 關閉操作很重要,否則資源被佔用,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。
解決屬性名和欄位名不一致的問題(ResultMap結果對映集)
資料庫
實體類
private int id;
private String name;
private String password;
結果
解決方法
- 起別名
<select id="getUserById" parameterType="int" resultType="user">
select id,name,pwd as password from user where id = #{id};
</select>
結果
2. resultMap結果對映集
<resultMap id="userMap" type="User">
<!--property表示實體類的屬性,column表示資料庫的欄位名-->
<!--<result column="id" property="id"></result>
<result column="name" property="name"></result>-->
<result column="pwd" property="password"></result>
</resultMap>
<select id="getUserById" resultMap="userMap">
select * from user where id = #{id};
</select>
結果
resultMap
元素是 MyBatis 中最重要最強大的元素。- ResultMap的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。
- 當你十分了解時就不需要顯式配置
ResultMap
,這就是ResultMap
的優秀之處——你完全可以不用顯式地配置它們。 - 如果這個世界總是這麼簡單就好了。
上一節—>配置解析
如有不對的地方歡迎指出,共同進步!