Mybatis踩坑第五彈—DynamicSQL

MyBatis 中用於動態SQL的標籤包括 if、where 、choose、trim、foreach、bind、sql,下面來分別說明一下。

if 標籤可以通過判斷傳入的值來確定查詢條件,其中 test 指定一個OGNL表達式,Mybatis 會根據表達式的值決定是否使用標籤體內的查詢條件,

但是,在某些情況下,只是用 if 標籤會出現 SQL 拼裝的問題,比如多出來 and 或者 or,通常有以下幾種解決方案:

1、直接在 where 關鍵字後面加上 1=1,後面的 SQL 統一寫成 and xxx(不夠優雅)。

2、使用 where 標籤,Mybatis 會將 where 標籤中多餘的第一個 and 或者 or 去掉(相對優雅),但有時也會出現問題,比如在每個 if 標籤體的最後寫 and

3、Trim 標籤可以用於自定義字符串截取規則,Trim 標籤體中是整個字符串拼串後的結果,perfix 屬性給拼串後的整個字符串加一個前綴,perfixOverrides 屬性去掉整個字符串前面多餘的字符,suffix 屬性給拼串後的整個字符串加一個後綴,suffixOverrides 屬性去掉整個字符串後面多餘的字符。

Tips:在 XML 文件中書寫特殊字符時需要轉義爲實體名稱;OGNL 會自動進行字符串與數字的轉化比較

choose 標籤實現的是選擇分支的功能,類似於 java 中的 switch,主要子標籤是 when 和

otherwise。

在更新操作時,可以使用 set 標籤,將需要更行的列與賦值放在裏面。

同理,foreach 標籤的用法類似 java

裏面的 foreach 操作,實現的是循環便利;當接口實現類傳入的參數是一個集合類時,可以使用 foreach 標籤來循環取值,然後賦值給查詢條件,可以用於批量操作;在使用 MySQL 時,可以使用一條插入語句 或者 多條插入語句的方式進行批量操作,如果採用多條查詢語句的方式,需要設置數據庫連接屬性 allowMultiQueries=true;如果在接口處不用 @Param 註解設置參數的值,那麼集合類參數的值要取 collection 或者 list,反之,則可以設置爲註解的 value 值。

Tip:在MySql中,insert、update、delete中不能使用別名,如果有外鍵約束時,插入或更新不存在的外鍵值會報錯。

bind 標籤可以用於將 OGNL 表達式的值綁定到一個變量上,方便後來引用這個變量。

sql 標籤用於抽取可重用的 sql 片段,方便 SQL 語句的複用;

1、sql 抽取:經常要查詢的列名,或者插入用的列名

2、使用 include 標籤來引用已經抽取的 sql

3、還可以使用 include 標籤來自定義一些 property 屬性

注意:在 sql 標籤中只能使用 ${} 取值,不能使用 #{}取值。

Mybatis 中有兩個內置參數,分別是 _parameter 和 _databaseId;_parameter 代表接口的參數,如果是單個參數,就指單個參數對象,如果是多個參數,就指多個參數封裝的 map 對象;_databaseId 代表當前數據庫廠上的別名標識,在配置有多數據庫廠商別名 databaseIdProvider 標籤時可以用來做鑑別選擇。

關注微信公衆號:Javall咖啡屋
每天更新各種技術學習心得體會
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章