動態sql
在一個複雜得業務邏輯的背景下,比如一個電商網站
在一個手機表中,可能需要按照品牌,型號,顏色,內存等多個屬性對手機表進行查找,如果對一個屬性寫一個查詢方法,那麼代碼將會非常複雜,所以我們思考:有沒有一種可能只寫一種方法就可以查詢出來業務。那麼他來了-----動態SQL
一、Where和if標籤
需求:查詢user表的數據。多個條件無腦組合
第一步:定義接口,接口中添加查詢方法
**注意:**定義方法時要考慮返回值與輸入參數
第二步:映射文件中添加方法實現配置
使用if標籤對條件做出判斷
<if test="id!=null">
id=#{id}
</if>
If(id!=null){ id=#{id}}
上述解決方案中存在where 1=1的無意義sql,使用Where標籤解決1=1的問題
注意:if標籤做條件判斷,test屬性中添加判斷添加,多條件時使用and拼接where標籤幫我們解決了1=1問題的同時,還可以幫助我們去掉第一個and
二、Set標籤
需求:修改person信息,傳什麼改什麼
第一步:接口中添加修改方法
第二步:映射文件中添加實現
**注意:**set標籤可以幫助我們解決最後一個逗號的問題
三、trim標籤
3.1重寫set標籤
**prefix:**前綴,在執行trim標籤內語句時,在前面拼接的值(set)
**SuffixOverrides:**忽略後綴,在執行trim標籤內語句時,在最後忽略的值(,)
3.2重寫Where標籤
PrefixOverrides:忽略前綴(and/or)
Suffix:後綴(加上where)
四、choose標籤
需求:如果有用戶的id,使用id查詢,如果沒有id,看是否有那麼,按name模糊查詢,如果都沒有,按照地址模糊查,如果地址沒有,查詢全部
第一步:定義接口方法
第二步:映射文件中添加方法實現
注意:
Choose:表示單選,標籤下的條件只選擇一個執行
Choose相當於switch語句
When標籤相當於case語句
Otherwise標籤相當於default語句
五、foreach標籤
foreach標籤主要是用來做數據的循環遍歷
例如:select * from person where id in(4,5,6)在這樣的語句中,需要根據一個集合或者一個數組傳入的參數進行查詢。
Case 1:使用集合傳入用戶需要查詢的值
第一步:接口中定義方法
使用集合接收傳過來的id串。
第二步:映射文件中添加方法的實現配置
注意:
Foreach標籤:用於遍歷集合/數組
Collection屬性:代表要遍歷的集合元素,如果遍歷的是集合,屬性值可以是collection,也可以是list
Open屬性:代表語句的開始部分(前綴)
Close屬性:代表結束部分(後綴)
Item屬性:代表遍歷集合的每個元素,生成的變量名,取名要做到見名知意。
Separator屬性:代表分隔符
第三步:測試代碼
Case 2:使用數組傳入用戶查詢需要的id
第一步:接口方法
第二步:映射文件
注意:使用foreach遍歷 數組時,collection屬性值爲array
case 3:pojo對象集合屬性傳入用戶需要查詢的id
第一步:創建一個查詢對象QueryVO(補充查詢條件)
第二步:定義接口方法
第三步:添加映射
注意:
當foreach遍歷的是pojo的集合屬性或者數組屬性時,collection的屬性值爲屬性的名稱
第四步:測試代碼
第三步:添加映射**
[外鏈圖片轉存中…(img-xUKhckcg-1593526500513)]
注意:
當foreach遍歷的是pojo的集合屬性或者數組屬性時,collection的屬性值爲屬性的名稱
第四步:測試代碼