動態SQL
所謂動態SQL就是可以在SQL中自定義修改和新增邏輯。原本的SQL語句是寫死的,當需要進行區分時,需要再次寫SQL語句,所以動態SQL可以通過自定義邏輯來處理。
List<Student> getStudentBy(Map<String,Integer> map);
<!--動態SQL-->
<select id="getStudentBy" resultType="Student">
select * from student
<where>
<if test="sid != null">
id = #{sid}
</if>
<if test="sname != null">
and name = #{sname}
</if>
</where>
</select>
<select id="getStudentBy2" resultType="Student">
select * from student
<where>
<choose>
<when test="sid != null">
id = #{sid}
</when>
<when test="sname != null">
and name = #{sname}
</when>
<otherwise>
and tid = #{tid}
</otherwise>
</choose>
</where>
</select>
//測試類
@Test
public void test8() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
HashMap map = new HashMap();
map.put("sid",1);
List<Student> students = mapper.getStudentBy(map);
for (Student student : students) {
System.out.println(student);
}
sqlSession.close();
}
其它更多動態SQL,看官方文件
MyBatis快取機制
什麼是快取[ Cache ]?
- 存在記憶體中的臨時資料。
- 將使用者經常查詢的資料放在快取(記憶體)中,使用者去查詢資料就不用從磁碟上(關係型資料庫資料檔案)查詢,從快取中查詢,從而提高查詢效率,解決了高併發系統的效能問題。
為什麼使用快取?
- 減少和資料庫的互動次數,減少系統開銷,提高系統效率。
什麼樣的資料能使用快取?
- 經常查詢並且不經常改變的資料。
MyBatis包含一個非常強大的查詢快取特性,它可以非常方便地定製和配置快取。快取可以極大的提升查詢效率。
MyBatis系統中預設定義了兩級快取: 一級快取和二級快取
預設情況下,只有一級快取開啟。(SqISession級別的快取,也稱為本地快取)
二級快取需要手動開啟和配置, 他是基於namespace級別的快取。
為了提高擴充套件性,MyBatis定義了快取介面Cache。我們可以通過實現Cache介面來自定義二級快取
一級快取預設是開啟的,只在一-次SqISession中有效,也就是拿到連線到關閉連線這個區間段!一級快取相當於馬Map集合
快取失效的情況:
- 1.查詢不同的東西
- 2.增刪改操作,可能會改變原來的資料,所以必定會重新整理快取!
- 3.查詢不同的Mapper.xm|
- 4.手動清理快取!(sqlSession.clearCache())
開啟二級快取
<!--在mybatis-config.xml的setting中配置--> <!--顯示的開啟全域性快取--> <setting name="cacheEnabled" value="true"/>
<!--在Mapper.xml檔案中配置--> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
FIFO快取,每隔60秒重新整理,最多可以儲存結果物件或列表的512個引用,而且返回的物件被認為是隻讀的
工作機制
- 一個會話查詢一條資料,這個資料就會被放在當前會話的一級快取中:
- 如果當前會話關閉了,這個會話對應的一級快取就沒了;但是我們想要的是,會話關閉了,一級快取中的資料被儲存到二級快取中;
- 新的會話查詢資訊,就可以從二級快取中獲取內容;
- 不同的mapper查出的資料會放在自己對應的快取(map) 中;
- 快取順序
- 先看二級快取有沒有
- 在看一級快取有沒有
- 再查詢資料庫
本作品採用《CC 協議》,轉載必須註明作者和本文連結