mybatis快取機制
像大多數的持久化框架一樣,Mybatis 也提供了快取策略,通過快取策略來減少資料庫的查詢次數,從而提
高效能。
Mybatis 中快取分為一級快取,二級快取。
Mybatis 一級快取
一級快取是 SqlSession 級別的快取,只要 SqlSession 沒有 flush 或 close,它就存在。
一級快取是 SqlSession 範圍的快取,當呼叫 SqlSession 的修改,新增,刪除,commit(),close()等方法時,就會清空一級快取。
第一次發起查詢使用者 id 為 1 的使用者資訊,先去找快取中是否有 id 為 1 的使用者資訊,如果沒有,從資料庫查
詢使用者資訊。
得到使用者資訊,將使用者資訊儲存到一級快取中。
如果 sqlSession 去執行 commit 操作(執行插入、更新、刪除),清空 SqlSession 中的一級快取,這樣
做的目的為了讓快取中儲存的是最新的資訊,避免髒讀。
第二次發起查詢使用者 id 為 1 的使用者資訊,先去找快取中是否有 id 為 1 的使用者資訊,快取中有,直接從快取
中獲取使用者資訊。
Mybatis 二級快取
首先開啟 mybatis 的二級快取。
sqlSession1 去查詢使用者資訊,查詢到使用者資訊會將查詢資料儲存到二級快取中
如果 SqlSession3 去執行相同 mapper 對映下 sql,執行 commit 提交,將會清空該 mapper 對映下的二
級快取區域的資料。
sqlSession2 去查詢與 sqlSession1 相同的使用者資訊,首先會去快取中找是否存在資料,如果存在直接從
快取中取出資料。
二級快取的開啟與關閉
第一步:在 SqlMapConfig.xml 檔案開啟二級快取
<settings> <!-- 開啟二級快取的支援 --> <setting name="cacheEnabled" value="true"/> </settings> 因為 cacheEnabled 的取值預設就為 true,所以這一步可以省略不配置。為 true 代表開啟二級快取;為 false 代表不開啟二級快取。
2 第二步:配置相關的 Mapper 對映檔案
<cache>標籤表示當前這個 mapper 對映將使用二級快取,區分的標準就看 mapper 的 namespace 值。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.dao.IUserDao"> <!-- 開啟二級快取的支援 --> <cache></cache> </mapper>
** 第三步:配置 statement 上面的 useCache 屬性**
<!-- 根據 id 查詢 --> <select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select> 將 UserDao.xml 對映檔案中的<select>標籤中設定 useCache=”true”代表當前這個 statement 要使用
二級快取,如果不使用二級快取可以設定為 false。
注意:針對每次查詢都需要最新的資料 sql,要設定成 useCache=false,禁用二級快取。
二級快取注意事項
** 當我們在使用二級快取時,所快取的類一定要實現 java.io.Serializable 介面,這種就可以使用序列化
方式來儲存物件。**
/**
*
* <p>Title: User</p>
* <p>Description: 使用者的實體類</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address; }