Mybatis默認是不開啓二級緩存的,相對於同一個sqlsession而言只開啓一級緩存,所以在參數和sql完全相同的情況下,我們使用同一個sqlSession調用同一個mapper方法,只會執行一次sql查詢。
一:下面是一級緩存的實例,一級緩存是在sqlSession層面的
sqlSession=SqlSessionFactotyUtil.openSqlSession();
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
<!--第一次使用-->
List<Role> roles=roleMapper.findRoleByMap("d","9");
for (Role role2 : roles) {
System.out.println("符合條件的結果爲"+role2.getId());
}
<!--第二次使用-->
List<Role> roles3=roleMapper.findRoleByMap("d","9");
for (Role role2 : roles3) {
System.out.println("符合條件的結果爲"+role2.getId());
}
sqlSession.commit();
查詢的結果如下
<!--第一次結果-->
==> Preparing: select id,roleName as roleName, note from role where roleName like concat('%',?,'%') and note like concat('%',?,'%')
==> Parameters: d(String), 9(String)
<== Total: 2
符合條件的結果爲3
符合條件的結果爲5
<!--第二次結果-->
符合條件的結果爲3
符合條件的結果爲5
二級緩存是針對SqlSessionFactory的,不會在各種sqlSession之間隔離
開啓二級緩存
1.需要在xml影射中加入
<cache></cache>這樣設置都是默認的
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true" />s
flushInterval刷新間隔時間,100s
size 最大緩存的對象數量,不事宜過大,會導致內存溢出
readOnly 該爲true之後,數據只能讀取不能修改,這樣可以快速讀取緩存。默認爲false
eviction 緩存策略 lru爲最長時間不使用
還可以自定義緩存,就不介紹了
2.影射的實體類中要實現Serializable接口
@Alias("role")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String roleName;
private String note;
下面看實例代碼
sqlSession=SqlSessionFactotyUtil.openSqlSession();
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
<!--第一次使用-->
List<Role> roles=roleMapper.findRoleByMap("d","9");
for (Role role2 : roles) {
System.out.println("符合條件的結果爲"+role2.getId());
}
<!--第二次使用-->
List<Role> roles3=roleMapper.findRoleByMap("d","9");
for (Role role2 : roles3) {
System.out.println("符合條件的結果爲"+role2.getId());
}
sqlSession.commit();
<!-- 更換sqlsession之後-->
System.out.println("------------------------------");
sqlSession2=SqlSessionFactotyUtil.openSqlSession();
RoleMapper roleMapper2=sqlSession2.getMapper(RoleMapper.class);
List<Role> roles2=roleMapper2.findRoleByMap("d","9");
for (Role role3 : roles2) {
System.out.println("符合條件的結果爲"+role3.getId());
}
sqlSession2.commit();
開啓二級緩存之後結果如下
Cache Hit Ratio [com.learn.chapter2.mapper.RoleMapper]: 0.0
==> Preparing: select id,roleName as roleName, note from role where roleName like concat('%',?,'%') and note like concat('%',?,'%')
==> Parameters: d(String), 9(String)
<== Total: 2
符合條件的結果爲3
符合條件的結果爲5
Cache Hit Ratio [com.learn.chapter2.mapper.RoleMapper]: 0.0
符合條件的結果爲3
符合條件的結果爲5
------------------------------
Cache Hit Ratio [com.learn.chapter2.mapper.RoleMapper]: 0.3333333333333333
符合條件的結果爲3
符合條件的結果爲5
可以從結果看出,就算更換了sqlsession之後,也總共執行了一次sql查詢。