色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Mybatis動態(tài)SQL的實現(xiàn)示例

瀏覽:43日期:2023-10-22 11:10:40

場景

在實際應(yīng)用開發(fā)過程中,我們往往需要寫復(fù)雜的 SQL 語句,需要拼接,而拼接SQL語句又稍微不注意,由于引號,空格等缺失可能都會導(dǎo)致錯誤。Mybatis提供了動態(tài)SQL,也就是可以根據(jù)用戶提供的參數(shù),動態(tài)決定查詢語句依賴的查詢條件或SQL語句的內(nèi)容。

動態(tài)SQL標(biāo)簽

if 和 where 標(biāo)簽

<!--動態(tài)Sql : where / if--> <select resultType='com.lks.domain.User'> select <include refid='tableAllkey'/> from users <where> <if test='id != null and id != 0'>AND id = #{id} </if> <if test='name != null and name != ’’'>AND name = #{name} </if> <if test='county != null and county != ’’'>AND county = #{county} </if> </where> </select>

一般開發(fā)列表業(yè)務(wù)的查詢條件時,如果有多個查詢條件,通常會使用 標(biāo)簽來進(jìn)行控制。 標(biāo)簽可以自動的將第一個條件前面的邏輯運(yùn)算符 (or ,and) 去掉,正如代碼中寫的,id 查詢條件前面是有“and”關(guān)鍵字的,但是在打印出來的 SQL 中卻沒有,這就是 的作用。打印SQL語句的使用可以在mybatis-config文件中添加setting標(biāo)簽:

<settings> <!-- 打印查詢語句 --> <setting name='logImpl' value='STDOUT_LOGGING' /> </settings>

choose、when、otherwise 標(biāo)簽

這三個標(biāo)簽需要組合在一起使用,類似于 Java 中的 switch、case、default。只有一個條件生效,也就是只執(zhí)行滿足的條件 when,沒有滿足的條件就執(zhí)行 otherwise,表示默認(rèn)條件。

<!--動態(tài)Sql: choose、when、otherwise 標(biāo)簽--> <select resultType='com.lks.domain.User'> select * from users <where> <choose><when test='name != null and name != ’’'> AND name = #{name}</when><when test='county != null and county != ’’'> AND county = #{county}</when><otherwise> AND id = #{id}</otherwise> </choose> </where> </select>

在測試類中,即使同時添加name和county的值,最終的sql也只會添加第一個屬性值。

set 標(biāo)簽

使用set標(biāo)簽可以將動態(tài)的配置 SET 關(guān)鍵字,并剔除追加到條件末尾的任何不相關(guān)的逗號。使用 if+set 標(biāo)簽修改后,在進(jìn)行表單更新的操作中,哪個字段中有值才去更新,如果某項為 null 則不進(jìn)行更新,而是保持?jǐn)?shù)據(jù)庫原值。

<!--動態(tài)Sql: set 標(biāo)簽--> <update parameterType='com.lks.domain.User'> update users <set> <if test='name != null and name != ’’'>name = #{name}, </if> <if test='county != null and county != ’’'>county = #{county}, </if> </set> where id = #{id} </update>

trim 標(biāo)簽

trim 是一個格式化標(biāo)簽,可以完成< set > 或者是 < where > 標(biāo)記的功能。主要有4個參數(shù):① prefix:前綴

② prefixOverrides:去掉第一個and或者是or

③ suffix:后綴

④ suffixOverrides:去掉最后一個逗號,也可以是其他的標(biāo)記

<!--動態(tài)Sql: trim 標(biāo)簽--> <select resultType='com.lks.domain.User'> select * from users <trim prefix='where' suffix='order by age' prefixOverrides='and | or' suffixOverrides=','> <if test='name != null and name != ’’'>AND name = #{name} </if> <if test='county != null and county != ’’'>AND county = #{county} </if> </trim> </select>

foreach 標(biāo)簽

foreach標(biāo)簽主要有以下參數(shù):item :循環(huán)體中的具體對象。支持屬性的點(diǎn)路徑訪問,如item.age,item.info.details,在list和數(shù)組中是其中的對象,在map中是value。index :在list和數(shù)組中,index是元素的序號,在map中,index是元素的key,該參數(shù)可選。open :表示該語句以什么開始close :表示該語句以什么結(jié)束separator :表示元素之間的分隔符,例如在in()的時候,separator=','會自動在元素中間用“,“隔開,避免手動輸入逗號導(dǎo)致sql錯誤,如in(1,2,)這樣。該參數(shù)可選。

list批量插入

<!--動態(tài)Sql: foreach標(biāo)簽, 批量插入--> <insert useGeneratedKeys='true' keyProperty='id'> insert into users (name, age, county, date) values <foreach collection='list' item='user' separator=',' >(#{user.name}, #{user.age}, #{user.county}, #{user.date}) </foreach> </insert>

Mybatis動態(tài)SQL的實現(xiàn)示例

從結(jié)果可以看出,我們一下插入了兩條數(shù)據(jù),每條數(shù)據(jù)之間使用“,”進(jìn)行分割,separator=',' 的作用就是如此。其中< foreach >標(biāo)簽內(nèi)部的屬性務(wù)必加上item.。

list集合參數(shù)

<!--動態(tài)Sql: foreach標(biāo)簽, list參數(shù)查詢--> <select resultType='com.lks.domain.User'> SELECT * from users WHERE id in <foreach collection='list' item='id' open='(' close=')' separator=',' > #{id} </foreach> </select>

Mybatis動態(tài)SQL的實現(xiàn)示例

可以看出我們的 SQL 語句新增了:( ? , ? ) ,前后的括號由 open='(' close=')' 進(jìn)行控制,用“?”占位符占位,并通過separator以:“,”隔開,內(nèi)部兩個循環(huán)遍歷出的元素。array 集合與 list 的做法也是類似的:

<!--動態(tài)Sql: foreach標(biāo)簽, array參數(shù)查詢--> <select resultType='com.lks.domain.User'> select * from users WHERE id in <foreach collection='array' item='id' open='(' close=')' separator=','> #{id} </foreach> </select>

map參數(shù)

< map> 標(biāo)簽需要結(jié)合MyBatis的參數(shù)注解 @Param()來使用,需要告訴Mybatis配置文件中的collection='map'里的map是一個參數(shù):

<!--動態(tài)Sql: foreach標(biāo)簽, map參數(shù)查詢--> <select resultType='com.lks.bean.User'> select * from users WHERE <foreach collection='map' index='key' item='value' separator='='> ${key} = #{value} </foreach> </select>

需要主要${}和#{}的使用。

到此這篇關(guān)于Mybatis動態(tài)SQL的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Mybatis動態(tài)SQL內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 一区三区三区不卡 | 亚洲精品一区二区三区在线看 | 亚洲精选在线观看 | 亚洲精品国产成人中文 | 成年女人午夜免费视频 | 国产综合久久久久影院 | 高清国产一区二区三区 | 国产伦久视频免费观看 视频 | 亚洲一级毛片中文字幕 | 99色视频在线 | 欧洲免费无线码二区5 | 久草新免费 | 狠狠色丁香婷婷综合久久片 | 亚洲六月丁香六月婷婷蜜芽 | www.av在线.com| 午夜刺激爽爽视频免费观看 | 成人国产永久福利看片 | 国产91成人精品亚洲精品 | 国产二区三区毛片 | 亚洲欧美日韩在线播放 | 国产专区第一页 | 亚洲人成亚洲人成在线观看 | 在线视频一区二区三区四区 | 国产孕妇孕交视频在线观看 | 国产一区二区精品 | 女黄人东京手机福利视频 | 久章草在线 | 亚洲日本va午夜中文字幕 | 欧美亚洲中日韩中文字幕在线 | 456主播喷水在线观看 | 欧美成人全部费免网站 | 亚洲日韩精品欧美一区二区一 | 精品欧美高清一区二区免费 | 国产亚洲精品一区二区 | 韩日一级视频 | 日本免费一区二区三区毛片 | 亚洲欧美日韩在线观看二区 | 久久精品国产这里是免费 | 加勒比一区在线 | 波多野结衣在线观看一区二区三区 | 2022国产精品自拍 |