動態 SQL 和快取機制

HuDu發表於2020-06-20

動態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 協議》,轉載必須註明作者和本文連結

相關文章