日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

《MyBatis技术原理与实战》之动态SQL

發布時間:2025/3/20 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《MyBatis技术原理与实战》之动态SQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mybatis有兩種方式配置SQL

  • 方式一:使用XML文件配置

  • 方式二:在注解中配置SQL

通常,使用第一種方式,這里也只闡述第一種方式中SQL的用法


Mybatis動態的SQL常用的幾個元素

元素作用備注
if判斷語句單條件分之判斷
choose(when、otherwise)相當于java中的case when語句多條件分之判斷
trim(where、set)輔助元素用于處理一些SQL拼裝問題
foreach循環語句在in語句等列舉條件常用

動態SQL用法

(1)if元素

if相當于java中的if判斷語句,常常與test屬性聯合使用。實例如下:

查詢要求:根據角色名稱模糊查詢角色,但是角色名稱可填可不填。

<select id="findRoles" parameterType="string" resultMap="roleResultMap">select role_no,role_name,note from t_role where 1=1<if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName},'%')</if> </select>

備注:roleName是傳進的參數,參數名稱必須要對應。

(2)choose、when、otherwise元素

這三個元素是多條件判斷語句,相當于java中的switch…case…default語句。

查詢要求:

  • 當角色編號不為空,則根據角色編號查詢
  • 當角色編號為空,而角色名稱不為空,則根據角色名稱模糊查詢
  • 當角色編號和角色名稱均為空,則要求角色備注不為空
<select id="findRoles" parameterType="role" resultMap="roleResultMap">select role_no,role_name,note from t_role where 1=1<choose><when test="roleNo != null and roleNo != ''">and role_no = #{roleNo}</when><when test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName},'%')</when><otherwise>and note is not null</otherwise></choose> </select>

(3)trim、where、set元素

細心的讀者可以發現上面的查詢加入了一個條件”1=1“。若沒有這個條件,可能會出問題。
如果我們使用<where>就可以輕松解決這個問題了,當where中元素條件成立時,會給SQL語句自動加上where關鍵字,否則不加入。

<select id="findRoles" parameterType="string" resultMap="roleResultMap">select role_no,role_name,note from t_role <where><if test="roleName != null and roleName != ''">role_name like concat('%',#{roleName},'%')</if></where></select>

當然,方式不止一種,除了使用where標簽外,還可以使用trim進行處理。

<select id="findRoles" parameterType="string" resultMap="roleResultMap">select role_no,role_name,note from t_role <trim prefix="where" prefixOverrides="and"><if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName},'%')</if></trim> </select>

備注:prefix代表語句的前綴,當trim中元素條件成立時,會加上where關鍵zi
prefixOverrides代表是需要去掉的沒用字樣,比如這里的and。當當條件成立時,不去掉and,語句后半部分后變成where and and role_name like concat(‘%’,#{roleName},’%’),此時多個一個and。

set標簽一般用戶更新數據時使用。

<update id="updateRole" parameterType="role">update t_role<set><if test="roleName != null and roleName != ''">role_name = #{roleName},</if><if test="note != null and note != ''">note = #{note},</if></set>where role_no = #{roleNo} </update>

備注:set元素遇到逗號,會把對應的逗號去掉。

該語句也可以使用trim進行處理

<trim prefix="set" suffixOverrides=",">...</trim>

備注:suffixOverrides與prefixOverrides類似,前者是表示后綴,后者表示前綴。

1.where作用
a.當where標簽內有條件成立時,添加where關鍵字,反之,不加where關鍵字
b.當where內條件成立時,添加的條件最前面有多余的and,or等關鍵字時,會自動去除

2.set作用
a.添加set關鍵字
b.去除結尾多余的逗號

(4) foreach元素

該元素的作用是遍歷集合。Mybatis可以很好的支持數組和List、Set接口的集合。

查詢要求:根據性別查詢,性別參數是個集合,是由男、女、未知三種組成。

<select id="findUserBySex" resultType="user">select * from t_user where sex in<foreach item="sex" index="index" collection="sexList" open="(" separator="," close=")">#{sex}</foreach> </select>

備注:

  • collection配置的sexList是傳遞進的參數名稱,他可以是數組或者List,Set等集合
  • item配置的是循環中當前的元素
  • index配置的是當前元素在集合中的位置下標
  • open和close配置的是以什么符號將這些集合元素包裝起來。
  • separator是各個元素之間的間隔符。

注意:sql查詢中in一般會消耗大量的性能,同時一些數據庫對于sql的長度也有限制。

總結

以上是生活随笔為你收集整理的《MyBatis技术原理与实战》之动态SQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。