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 查詢,其他的也是這樣