mybatis 標簽 和注解 ( 動態 sql的 用法)


1. 動態 sql

 

 

 

 

 

 

 

 

 

 

 

 

mybatis  select 元素

 

 

 

 

 

 

總結:一般下執行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免數據庫臟讀。

注意:

(1)當為select語句時:

flushCache默認為false,表示任何時候語句被調用,都不會去清空本地緩存和二級緩存。

useCache默認為true,表示會將本條語句的結果進行二級緩存。

(2)當為insert、update、delete語句時:

flushCache默認為true,表示任何時候語句被調用,都會導致本地緩存和二級緩存被清空。

useCache屬性在該情況下沒有。

當為select語句的時候,如果沒有去配置flushCache、useCache,那么默認是啟用緩存的,所以,如果有必要,那么就需要人工修改配置

3.對應的pojo實現序列化(implements Serializable)

4.mybatis自身實現二級緩存弊端在於只能作用於數據庫,此時需要我們引用第三方庫作為緩存庫,這樣緩存更具有擴展性。。。(待

 

mybatis中還可以配置userCache和flushCache等配置項,userCache是用來設置是否禁用二級緩存的,useCache=false禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。

 

flushCache=”true”,默認情況下為true,即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現臟讀。

 

注意:開啟緩存的弊端是數據沒有實時性,當數據庫中的數據一旦修改,查詢的數據還是緩存中的數據沒有實時性,對於某些需要實時性顯示數據的接口我們可以設置useCache="false",設置該屬性后,該接口每次查詢出來都是去執行sql查詢出實時性數據。

 

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

 

官方文檔賞析:

 

https://mybatis.org/mybatis-3/zh/java-api.html

 

 

 

如何獲取最后一次插入的 ID

 

 

 

 

 

 

 

 

 

 

useGenerateKeys 只支持 mysql , sql server 這種

 

 

 

 

如果 用 mysql ,order 要設置 為 after , 而 Oracle 則是 設置 為 before ,因為 Oracle 是先拿到 id ,再插入到數據, mysql 則是插入后 自動生成的。

 

 

 

mybatis 動態 sql 用法

 

 

 

如果所有 的 if 都不成功, 不會加 where

如果只有一個 if 成功,就刪除 where 后面的 那一個 and

 

mybatis 動態 sql 部分更新

 

 

 

 

但是 以上寫法有問題, 最后一個 if 沒有成功,前面 if 成功了, 會 加個 逗號,於是就出問題了

 

 

 

 

set 標簽 會把最后一個 if 的逗號 去掉,這樣 sql 更新就不會出問題了。。。

 

 

上面 的 where  ,set 分別解決 查詢 和 更新問題, 還有一個 插入問題,也是用來解決多一個逗號的標簽, trim

insert  只能用 trim 實現動態 sql

 

 

foreach 標簽 用於解決 數組參數遍歷問題

 

 

 

 

 

 

mybatis 使用批量操作的實現:

1. 使用 foreach 標簽 批量執行

2. jdbc標准: jdbc本來就支持批量操作: 【mybatis 也可以使用 jdbc的批量操作】

 

 

 

 

 

 

之后 executeBatch() 返回數組,即 每條 sql 影響的 行數

 

 

 

 

 

 

Choose 和 when 的基本使用:

這個 是 最重要的: ddd ,最后 最重要的 

為什么要配合 choose when 來使用:

不知道 有沒有經歷過這種處境:

1. 一張表,有多個  屬性可以推導出 表中的某一行

比如:

1. 我使用自增主鍵 可以推到 那一行的數據

2. 比如我可以使用  學校 Id  + 個人學號 ID   推導出 那一行數據

3. 我可以使用 微信的 unionId  唯一確定 表中的那個數據

4. 我可以使用 微信 的 openID 唯一確定表中的那一行數據

5. 我還可以使用 身份證 唯一確定表中的那行數據

6. 我可以使用 email 賬號 + password 的方式 唯一確定表中的那行數據

 

現在問題來了: 這么多屬性,都可以唯一確定 表中的那行數據,我需不需要 把 6種場景 都寫一條 sql ,還是 使用動態 sql 的方法?

 

 

 

 

答案是配合 where + choose 來實現多條件的選擇,類似 switch 語句

這里就有個 優先級別判斷了,比如 一張表的主鍵不為 null, 那么 優先使用主鍵查詢

如果 unionID 不為null,再使用 unionID 查詢,其他的也是這樣

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM