Mybatis動態(tài)Sql標(biāo)簽使用小結(jié)
一、前言
常用的動態(tài)sql標(biāo)簽包括 if、choose(when、otherwise)、trim(where、set)、foreach。
二、標(biāo)簽介紹
2.1、if 標(biāo)簽
1、動態(tài)拼接查詢條件
select DISTINCT ksid as id,ksdm as cd , ksmc as na ,id_org ,1 as fg_active,kspydm as py FROM
V_CIS_RO_USER
WHERE 1=1
<if test="orgId != null">
AND id_org = #{orgId}
</if>
<if test="userId != null">
AND YHID = #{userId}
</if>
<if test="id != null">
AND ksid = #{id}
</if>
<if test="search != null and search != '' ">
and kspydm LIKE concat('%', concat(#{search}, '%'))
</if>
ORDER BY kspydm
2、動態(tài)選擇不同的執(zhí)行sql
根據(jù)輸入?yún)?shù)unitType的不同情況來join不同的表查詢結(jié)果集。
<select id="getAdjRatios" resultType="com.fp.epower.model.dto.PowerPredictAdjDto">
<if test="unitType == null">
SELECT a.*,b.date,b.status FROM power_forecast_adjust_data a
LEFT JOIN power_forecast_adjust_info b
ON a.info_id = b.id
</if>
<if test="unitType != null and unitType == 1">
SELECT a.*,b.date,b.status,c.dispatch_name unitName FROM power_forecast_adjust_data a
LEFT JOIN power_forecast_adjust_info b
ON a.info_id = b.id
LEFT JOIN gen_set c
ON a.unit_id = c.id
</if>
<if test="unitType != null and unitType == 2">
SELECT a.*,b.date,b.status,c.abbreviation unitName FROM power_forecast_adjust_data a
LEFT JOIN power_forecast_adjust_info b
ON a.info_id = b.id
LEFT JOIN dic_power_plant_info c
ON a.unit_id = c.id
</if>
<where>
<if test="status != null">
b.status = #{status}
</if>
<if test="unitType != null and unitType != 0">
AND a.unit_type = #{unitType}
</if>
<if test="date != null">
AND b.date = #{date}
</if>
</where>
</select>
2.2、choose(when、otherwise) 標(biāo)簽
如果拼接的查詢條件存在多個分支,可以使用 choose(類似于switch關(guān)鍵字)
<select id="getAdjRatio" resultType="java.lang.String">
SELECT ratio FROM power_forecast_adjust_data a
LEFT JOIN power_forecast_adjust_info b
ON a.info_id = b.id
<choose>
<when test="status != null and status != 0">
b.`status` = #{status}
</when>
<when test="unitType != null and unitType != 0">
AND a.unit_type = #{unitType}
</when>
<when test="unitId != null and unitId != ''">
AND a.unit_id = #{unitId}
</when>
<when test="date != null">
AND b.date = #{date}
</when>
<otherwise>
b.`status` = 1
</otherwise>
</choose>
</select>
2.3、trim(where、set) 標(biāo)簽
使用 trim 可以定義如何覆蓋前綴或者后綴,可以定義where節(jié)點、set節(jié)點等在有多余字符存在的情況下的前后綴覆蓋策略。
<select id="selectUsers" resultType="com.example.User">
SELECT *
FROM user
<trim prefix="WHERE" prefixOverrides="AND | OR ">
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="gender != null">
AND gender = #{gender}
</if>
</trim>
</select>
說明:
在語句的FROM子句后面使用了標(biāo)簽來處理WHERE子句中的條件。下面是對標(biāo)簽的幾個常用屬性的解釋:
1、prefix:指定在元素內(nèi)容之前添加的字符串,這里是"WHERE",即在WHERE子句之前添加"WHERE"關(guān)鍵字。
2、prefixOverrides:指定需要從元素內(nèi)容中移除的字符串,多個字符串使用"|"隔開,這里移除了以"AND"或"OR"開頭的內(nèi)容。
在 trim 標(biāo)簽中,根據(jù)條件判斷使用 if 標(biāo)簽來動態(tài)生成SQL語句的WHERE子句。if 標(biāo)簽的test屬性用于判斷條件是否成立,如果條件成立,則會將 if 標(biāo)簽中的內(nèi)容添加到生成的SQL語句中。
最終生成的SQL語句將會根據(jù)傳入的參數(shù)動態(tài)生成,只在滿足條件的情況下添加WHERE子句的條件,如下所示:
SELECT * FROM user WHERE name = #{name} AND age = #{age}
注意,由于使用了 trim 標(biāo)簽,只有在滿足條件的情況下才會添加WHERE關(guān)鍵字和相應(yīng)的條件。
2.4、foreach 標(biāo)簽
1、foreach元素的屬性
item: 集合元素迭代時的別名稱,該參數(shù)為必選項,如果遍歷的對象是map,則item為val;
index: 在list、array中,index為元素的序號索引。但是在Map中,index為遍歷元素的key值,該參數(shù)為可選項;
open: 遍歷集合時的開始符號,通常與close=")"搭配使用。使用場景IN(),values()時,該參數(shù)為可選項;
separator: 元素之間的分隔符,類比在IN()的時候,separator=“,”,最終所有遍歷的元素將會以設(shè)定的(,)逗號符號隔開,該參數(shù)為可選項;
close: 遍歷集合時的結(jié)束符號,通常與open="("搭配使用,該參數(shù)為可選項;
2、collection屬性值的三種情況
2.1、如果傳入的參數(shù)類型為list時: collection的默認(rèn)屬性值為list,同樣可以使用@Param注解自定義name;
2.2、如果傳入的參數(shù)類型為array時: collection的默認(rèn)屬性值為array,同樣可以使用@Param注解自定義name;
2.3、如果傳入的參數(shù)類型為Map時: collection的屬性值可為三種情況:1.遍歷map.keys;2.遍歷map.values;3.遍歷map.entrySet();
3、代碼示例
<select id="getAdjRatio" resultType="java.lang.String">
SELECT ratio FROM power_forecast_adjust_data a
LEFT JOIN power_forecast_adjust_info b
ON a.info_id = b.id
<where>
id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>到此這篇關(guān)于Mybatis動態(tài)Sql標(biāo)簽使用小結(jié)的文章就介紹到這了,更多相關(guān)Mybatis動態(tài)Sql標(biāo)簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis中動態(tài)SQL的使用指南
- MyBatis中實現(xiàn)動態(tài)SQL標(biāo)簽
- 使用MyBatis的動態(tài)SQL注解實現(xiàn)實體的CRUD操作代碼
- MyBatis實現(xiàn)動態(tài)SQL的方法
- Mybatis之動態(tài)SQL使用小結(jié)(全網(wǎng)最新)
- MyBatis中的XML實現(xiàn)和動態(tài)SQL實現(xiàn)示例詳解
- MyBatis映射文件中的動態(tài)SQL實例詳解
- 詳解MyBatis特性之動態(tài)SQL
- Mybatis使用注解實現(xiàn)復(fù)雜動態(tài)SQL的方法詳解
- MyBatis的動態(tài)攔截sql并修改
- mybatis動態(tài)生成sql語句的實現(xiàn)示例
相關(guān)文章
解決RedisTemplate的key默認(rèn)序列化器的問題
這篇文章主要介紹了解決RedisTemplate的key默認(rèn)序列化器的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
java 分轉(zhuǎn)元與元轉(zhuǎn)分實現(xiàn)操作
這篇文章主要介紹了java 分轉(zhuǎn)元與元轉(zhuǎn)分實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
IntelliJ IDEA 使用經(jīng)驗總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗總結(jié),非常不錯,具有參考價值,需要的朋友可以參考下2018-02-02
IntelliJ IDEA中Project與Module的概念以及區(qū)別
這篇文章主要給大家介紹了關(guān)于IntelliJ IDEA中Project與Module的概念以及區(qū)別的相關(guān)資料,文中通過實例介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java 實現(xiàn)將一個string保存到txt文檔中
今天小編就為大家分享一篇java 實現(xiàn)將一個string保存到txt文檔中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

