MyBatis的9種動態(tài)標(biāo)簽詳解
前言
MyBatis提供了9種動態(tài)SQL標(biāo)簽:trim、where、set、foreach、if、choose、when、otherwise、bind;
其執(zhí)行原理為,使用OGNL從SQL參數(shù)對象中計算表達(dá)式的值,根據(jù)表達(dá)式的值動態(tài)拼接SQL,以此來完成動態(tài)SQL的功能。
動態(tài)標(biāo)簽用法
1.if
If : 當(dāng)參數(shù)滿足條件才會執(zhí)行某個條件
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu WHERE age = 20
<if test="name != null">
AND name like #{name}
</if>
</select>
2.choose、when、otherwise
choose、when、otherwise : choose標(biāo)簽是按順序判斷其內(nèi)部when標(biāo)簽中的test條件是否成立,如果有一個成立,則choose結(jié)束;如果所有的when條件都不滿足時,則執(zhí)行otherwise中的SQL。類似于java的switch語句。
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu WHERE age = #{age}
<choose>
<when test="name != null">
AND name like #{name}
</when>
<when test="class != null">
AND class like #{class}
</when>
<otherwise>
AND class = 1
</otherwise>
</choose>
</select>
3.where
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu WHERE
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
AND class = #{class}
</if>
</select>
當(dāng)?shù)谝粋€if不滿或第一第二第三個if都不滿足,會出現(xiàn)以下情況
SELECT stu.name FROM tab_stu stu WHERE AND name = "小米" AND class ="1班”; SELECT stu.name FROM tab_stu stu WHERE;
這會導(dǎo)致查詢失敗。使用where標(biāo)簽可以解決這個問題
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu
<where>
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
AND class = #{class}
</if>
</where>
</select>
where標(biāo)簽會在只有一個以上的if條件滿足的情況下才去插入WHERE關(guān)鍵字,而且,若最后的內(nèi)容是”AND”或”O(jiān)R”開頭的,where也會根據(jù)語法絕對是否需要保留。
4.set
set標(biāo)簽用于解決動態(tài)更新語句存在的符號問題
<update id="updateStu">
Update tab_stu
<set>
<if test="name != null"> name=#{name},</if>
<if test="age != null"> age=#{age},</if>
<if test="class != null"> class=#{class},</if>
<if test="subject != null"> subject=#{subject}</if>
</set>
</update>
set標(biāo)簽會動態(tài)前置SET關(guān)鍵字,同時也會消除無關(guān)的逗號,因?yàn)橛昧藯l件語句后,可能就會在生成的賦值語句的后面留下逗號。
5.trim
trim:trim標(biāo)簽可實(shí)現(xiàn)where/set標(biāo)簽的功能
Trim標(biāo)簽有4個屬性,分別為prefix、suffix、prefixOverrides、suffixOverrides
prefix:表示在trim標(biāo)簽包裹的SQL前添加指定內(nèi)容
suffix:表示在trim標(biāo)簽包裹的SQL末尾添加指定內(nèi)容
prefixOverrides:表示去掉(覆蓋)trim標(biāo)簽包裹的SQL指定首部內(nèi)容,去掉多個內(nèi)容寫法為and |or(中間空格不能省略)(一般用于if判斷時去掉多余的AND |OR)
suffixOverrides:表示去掉(覆蓋)trim標(biāo)簽包裹的SQL指定尾部內(nèi)容(一般用于update語句if判斷時去掉多余的逗號)
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu
<trim prefix="where" prefixOverrides="and |or">
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
OR class = #{class}
</if>
</trim>
</select>
<update id=”updateStu”>
Update tab_stu
<trim prefix="set" subfix="where id=#{id}" suffixOverrides=",">
<if test="name != null"> name=#{name},</if>
<if test="age != null"> age=#{age},</if>
<if test="class != null"> class=#{class},</if>
<if test="subject != null"> subject=#{subject}</if>
</trim>
</update>
6.foreach
foreach:對集合進(jìn)行遍歷
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu where id in
<foreach item=”item” index=”index” collection=”listName” open=”(” separator=”,” close=”)”>
#{item}
</foreach>
</select>
下面是foreach標(biāo)簽的各個屬性:
collection:迭代集合的名稱,可以使用@Param注解指定,該參數(shù)為必選(java入?yún)?,相對?{listName})
item:表示本次迭代獲取的元素,若collection為List、Set或數(shù)組,則表示其中元素;若collection為Map,則代表key-value的value,該參數(shù)為必選
index:在List、Set和數(shù)組中,index表示當(dāng)前迭代的位置,在Map中,index指元素的key,該參數(shù)是可選項(xiàng)
open:表示該語句以什么開始,最常使用的是左括弧”(”,MyBatis會將該字符拼接到foreach標(biāo)簽包裹的SQL語句之前,并且只拼接一次,該參數(shù)是可選項(xiàng)
close:表示該語句以什么結(jié)束,最常使用的是右括弧”)”,MyBatis會將該字符拼接到foreach標(biāo)簽包裹的SQL語句末尾,該參數(shù)是可選項(xiàng)
separator:MyBatis會在每次迭代后給SQL語句添加上separator屬性指定的字符,該參數(shù)是可選項(xiàng)
7.bind
bind:bind標(biāo)簽可以從OGNL(對象圖導(dǎo)航語言)表達(dá)式中創(chuàng)建一個變量并將其綁定到上下文
Mybatis中使用Mysql的模糊查詢字符串拼接(like) 中也涉及到bind的使用
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu
<where>
<if test="name!= null">
<bind name="stuName" value="'%'+stuName+'%'">
name like #{stuName}
</if>
</where>
</select>
到此這篇關(guān)于MyBatis的9種動態(tài)標(biāo)簽詳解的文章就介紹到這了,更多相關(guān)MyBatis動態(tài)標(biāo)簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在?Java?中將Object?轉(zhuǎn)換為?Int的四種方法
這篇文章主要介紹了在Java中如何將?Object?轉(zhuǎn)換為Int,本文研究了在?Java中將Object轉(zhuǎn)換為int的四種不同方法,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
詳解lombok @Getter @Setter 使用注意事項(xiàng)
這篇文章主要介紹了詳解lombok @Getter @Setter 使用注意事項(xiàng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
使用c3p0連接數(shù)據(jù)庫實(shí)現(xiàn)增刪改查
這篇文章主要為大家詳細(xì)介紹了使用c3p0連接數(shù)據(jù)庫實(shí)現(xiàn)增刪改查,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
Java Annotation(Java 注解)的實(shí)現(xiàn)代碼
本篇文章介紹了,Java Annotation(Java 注解)的實(shí)現(xiàn)代碼。需要的朋友參考下2013-05-05
SpringBoot實(shí)現(xiàn)阿里云短信發(fā)送的示例代碼
這篇文章主要為大家介紹了如何利用SpringBoot實(shí)現(xiàn)阿里云短信發(fā)送,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-04-04
SpringBoot快速設(shè)置攔截器并實(shí)現(xiàn)權(quán)限驗(yàn)證的方法
本篇文章主要介紹了SpringBoot快速設(shè)置攔截器并實(shí)現(xiàn)權(quán)限驗(yàn)證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
java面向?qū)ο?API(接口)與集合(ArrayList)
這篇文章主要介紹了Java語言面向?qū)ο蟮腁PI與集合,還是十分不錯的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來幫助2021-08-08

