Mybatis動(dòng)態(tài)Sql標(biāo)簽使用小結(jié)
一、前言
常用的動(dòng)態(tài)sql標(biāo)簽包括 if、choose(when、otherwise)、trim(where、set)、foreach。
二、標(biāo)簽介紹
2.1、if 標(biāo)簽
1、動(dòng)態(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、動(dòng)態(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)簽
如果拼接的查詢條件存在多個(gè)分支,可以使用 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é)點(diǎn)、set節(jié)點(diǎn)等在有多余字符存在的情況下的前后綴覆蓋策略。
<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子句中的條件。下面是對(duì)標(biāo)簽的幾個(gè)常用屬性的解釋:
1、prefix:指定在元素內(nèi)容之前添加的字符串,這里是"WHERE",即在WHERE子句之前添加"WHERE"關(guān)鍵字。
2、prefixOverrides:指定需要從元素內(nèi)容中移除的字符串,多個(gè)字符串使用"|"隔開,這里移除了以"AND"或"OR"開頭的內(nèi)容。
在 trim 標(biāo)簽中,根據(jù)條件判斷使用 if 標(biāo)簽來動(dòng)態(tài)生成SQL語句的WHERE子句。if 標(biāo)簽的test屬性用于判斷條件是否成立,如果條件成立,則會(huì)將 if 標(biāo)簽中的內(nèi)容添加到生成的SQL語句中。
最終生成的SQL語句將會(huì)根據(jù)傳入的參數(shù)動(dòng)態(tài)生成,只在滿足條件的情況下添加WHERE子句的條件,如下所示:
SELECT * FROM user WHERE name = #{name} AND age = #{age}
注意,由于使用了 trim 標(biāo)簽,只有在滿足條件的情況下才會(huì)添加WHERE關(guān)鍵字和相應(yīng)的條件。
2.4、foreach 標(biāo)簽
1、foreach元素的屬性
item: 集合元素迭代時(shí)的別名稱,該參數(shù)為必選項(xiàng),如果遍歷的對(duì)象是map,則item為val;
index: 在list、array中,index為元素的序號(hào)索引。但是在Map中,index為遍歷元素的key值,該參數(shù)為可選項(xiàng);
open: 遍歷集合時(shí)的開始符號(hào),通常與close=")"搭配使用。使用場(chǎng)景IN(),values()時(shí),該參數(shù)為可選項(xiàng);
separator: 元素之間的分隔符,類比在IN()的時(shí)候,separator=“,”,最終所有遍歷的元素將會(huì)以設(shè)定的(,)逗號(hào)符號(hào)隔開,該參數(shù)為可選項(xiàng);
close: 遍歷集合時(shí)的結(jié)束符號(hào),通常與open="("搭配使用,該參數(shù)為可選項(xiàng);
2、collection屬性值的三種情況
2.1、如果傳入的參數(shù)類型為list時(shí): collection的默認(rèn)屬性值為list,同樣可以使用@Param注解自定義name;
2.2、如果傳入的參數(shù)類型為array時(shí): collection的默認(rèn)屬性值為array,同樣可以使用@Param注解自定義name;
2.3、如果傳入的參數(shù)類型為Map時(shí): 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動(dòng)態(tài)Sql標(biāo)簽使用小結(jié)的文章就介紹到這了,更多相關(guān)Mybatis動(dòng)態(tài)Sql標(biāo)簽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis中動(dòng)態(tài)SQL的使用指南
- MyBatis中實(shí)現(xiàn)動(dòng)態(tài)SQL標(biāo)簽
- 使用MyBatis的動(dòng)態(tài)SQL注解實(shí)現(xiàn)實(shí)體的CRUD操作代碼
- MyBatis實(shí)現(xiàn)動(dòng)態(tài)SQL的方法
- Mybatis之動(dòng)態(tài)SQL使用小結(jié)(全網(wǎng)最新)
- MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn)示例詳解
- MyBatis映射文件中的動(dòng)態(tài)SQL實(shí)例詳解
- 詳解MyBatis特性之動(dòng)態(tài)SQL
- Mybatis使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL的方法詳解
- MyBatis的動(dòng)態(tài)攔截sql并修改
- mybatis動(dòng)態(tài)生成sql語句的實(shí)現(xiàn)示例
相關(guān)文章
解決RedisTemplate的key默認(rèn)序列化器的問題
這篇文章主要介紹了解決RedisTemplate的key默認(rèn)序列化器的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03java 分轉(zhuǎn)元與元轉(zhuǎn)分實(shí)現(xiàn)操作
這篇文章主要介紹了java 分轉(zhuǎn)元與元轉(zhuǎn)分實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié),非常不錯(cuò),具有參考價(jià)值,需要的朋友可以參考下2018-02-02深入解析java中的靜態(tài)代理與動(dòng)態(tài)代理
本篇文章是對(duì)java中的靜態(tài)代理與動(dòng)態(tài)代理進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10IntelliJ IDEA中Project與Module的概念以及區(qū)別
這篇文章主要給大家介紹了關(guān)于IntelliJ IDEA中Project與Module的概念以及區(qū)別的相關(guān)資料,文中通過實(shí)例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中
今天小編就為大家分享一篇java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07