1. 程式人生 > 其它 >Mybatis知識小匯(4)——作用域(Scope)和生命週期、ResultMap結果對映集

Mybatis知識小匯(4)——作用域(Scope)和生命週期、ResultMap結果對映集

技術標籤:mybatis

文章目錄

作用域(Scope)和生命週期

生命週期作用域是至關重要的,因為錯誤的使用會導致非常嚴重的併發問題

SqlSessionFactoryBuilder

  • 這個類可以被例項化、使用和丟棄,一旦建立了 SqlSessionFactory,就不再需要它了。
  • 因此 SqlSessionFactoryBuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數
    )。
  • 你可以重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 例項,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactory

可以想象成資料庫連線池

  • SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項。
  • 使用 SqlSessionFactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建SqlSessionFactory 被視為一種程式碼“壞習慣”。
  • 因此SqlSessionFactory 的最佳作用域是應用作用域
  • 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

可以想象成連線到連線池的請求

  • 每個執行緒都應該有它自己的 SqlSession 例項
  • SqlSession的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域請求或方法作用域
  • 絕對不能將 SqlSession 例項的引用放在一個類的靜態域,甚至一個類的例項變數也不行。也絕不能將 SqlSession 例項的引用放在任何型別的託管作用域中,比如 Servlet 框架中的 HttpSession。
  • 關閉操作很重要,否則資源被佔用,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。

解決屬性名和欄位名不一致的問題(ResultMap結果對映集)

資料庫

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-aCtCAAX4-1612830111497)(Mybatis.assets/image-20210208195127862.png)]

實體類

private int id;
private String name;
private String password;

結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ldRwQMga-1612830111500)(Mybatis.assets/image-20210208195554050.png)]

解決方法

  1. 起別名
<select id="getUserById" parameterType="int" resultType="user">
    select id,name,pwd as password from user where id = #{id};
</select>

結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-wdLqF4zd-1612830111501)(Mybatis.assets/image-20210208201331908.png)]
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>

結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-myub9N7K-1612830111503)(Mybatis.assets/image-20210208201738402.png)]

  • resultMap 元素是 MyBatis 中最重要最強大的元素。
  • ResultMap的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。
  • 當你十分了解時就不需要顯式配置 ResultMap,這就是 ResultMap的優秀之處——你完全可以不用顯式地配置它們。
  • 如果這個世界總是這麼簡單就好了。
    上一節—>配置解析
    如有不對的地方歡迎指出,共同進步!