您好,登錄后才能下訂單哦!
好程序員 Java 分享 Mybatis 必會(huì)的動(dòng)態(tài) SQL , 前言 :
Mybatis 可謂是 java 開(kāi)發(fā)者必須會(huì)的一項(xiàng)技能。 MyBatis 的強(qiáng)大特性之一便是它的動(dòng)態(tài) SQL 。如果你有使用 JDBC 或其它類似框架的經(jīng)驗(yàn),你就能體會(huì)到根據(jù)不同條件拼接 SQL 語(yǔ)句的痛苦。例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài) SQL 這一特性可以徹底擺脫這種痛苦。
mybatis 動(dòng)態(tài)SQL,通過(guò) if, choose, when, otherwise, trim, where, set, foreach等標(biāo)簽,可組合成非常靈活的SQL語(yǔ)句,從而在提高 SQL 語(yǔ)句的準(zhǔn)確性的同時(shí),也大大提高了開(kāi)發(fā)人員的效率。本文主要介紹這幾個(gè)動(dòng)態(tài)SQL .
if標(biāo)簽 if就是用來(lái)對(duì)輸入映射的字段進(jìn)行判斷 一般是非空判斷 null 和""。
1. <!-- 案例 1 :動(dòng)態(tài) sql 之 if -->
2. <select id = "selectUsersIf" parameterType = "user" resultType = "user" >
3. select * from users where 1 =1
4. <if test = "uname!=null and uname!=''" > and uname like "%"#{uname}"%" </if>
5. <if test = "sex!=null and sex!=''" > and sex = #{sex} </if>
6. </select>
動(dòng)態(tài) SQL <where /> 相當(dāng)于 where 關(guān)鍵字 <where /> 可以自動(dòng)處理第一個(gè)前 and 或者 or 。 當(dāng)條件都沒(méi)有的時(shí)候 where 也不會(huì)加上 。
1. <!-- 案例 2 :動(dòng)態(tài) sql 之 where 可以自動(dòng)處理第一個(gè)前 and 或者 or 。當(dāng)條件都沒(méi)有的時(shí)候 where 也不會(huì)加上 -->
2. <select id = "selectUsersWhere" parameterType = "user" resultType = "user" >
3. select * from users
4. <where>
5. <if test = "uname!=null and uname!=''" > and uname like "%"#{uname}"%" </if>
6. <if test = "sex!=null and sex!=''" > and sex = #{sex} </if>
7. </where>
choose — when--when--otherwise when 可以多個(gè) otherwise 只能有一個(gè) 類似于 switch case 。
需求:輸入用戶 id 按照用戶 id 進(jìn)行精確查找 其他條件不看 沒(méi)有輸入 id 用戶名模糊查找 都沒(méi)有的話 查詢 id=1 的用戶
1. <!-- 案例 3 :動(dòng)態(tài) sql 之 choose—when when otherwise -->
2.
3. <select id = "selectUsersChoose" parameterType = "user" resultType = "user" >
4. select * from users
5. <where>
6. <choose>
7. <when test = "uid!=null" > uid =#{uid} </when>
8. <when test = "uname!=null and uname!=''" > uname like "%"#{uname}"%" </when>
9. <otherwise> uid = 1 </otherwise>
10.
11. </choose>
12. </where>
13. </select>
動(dòng)態(tài) sql 之 set 代替 set 關(guān)鍵字 set 標(biāo)簽可以幫助我們?nèi)サ糇詈笠粋€(gè)逗號(hào)
1. <update id = "updateSet" parameterType = "user" >
2.
3. update users
4.
5. <set>
6. <if test = "uname!=null and uname!=''" > uname =#{uname}, </if>
7. <if test = "upwd!=null and upwd!=''" > upwd =#{upwd}, </if>
8. <if test = "sex!=null and sex!=''" > sex =#{sex}, </if>
9. <if test = "birthday!=null" > birthday =#{birthday}, </if>
10. </set>
11. where uid =#{uid}
12. </update>
Trim , trim 代替 where
1. <!-- 案例 5 :動(dòng)態(tài) sql 之 trim 代替 where -->
2. <select id = "selectUsersTrimWhere" parameterType = "user" resultType = "user" >
3. select * from users
4. <!--
5. prefix: 指添加前綴修飾
6. suffix: 添加后綴修飾
7. prefixOverrides :去掉前綴修飾
8. suffixOverrides :去掉后綴修飾
9. -- >
10. < trim prefix = "where" prefixOverrides = "and|or" >
11. <if test = "uname!=null and uname!=''" > and uname like "%"#{uname}"%" </if>
12. <if test = "sex!=null and sex!=''" > and sex = #{sex} </if>
13. </trim>
14. </select>
Trim 代替 set :
1. <!-- 案例 6 :動(dòng)態(tài) sql 之 trim 代替 set -->
2. <update id = "updateTrimSet" parameterType = "user" >
3.
4. update users
5.
6. <trim prefix = "set" suffixOverrides = "," suffix = "where uid=#{uid}" >
7. <if test = "uname!=null and uname!=''" > uname =#{uname}, </if>
8. <if test = "upwd!=null and upwd!=''" > upwd =#{upwd}, </if>
9. <if test = "sex!=null and sex!=''" > sex =#{sex}, </if>
10. <if test = "birthday!=null" > birthday =#{birthday}, </if>
11. </trim>
12.
F oreach 來(lái)遍歷集合
1. <!-- 案例 7: 動(dòng)態(tài) sql 之 foreach 遍歷數(shù)組 -->
2. <select id = "selectUsersForeachArray" resultType = "user" >
3. select * from users where uid in
4. <!--
5. collection: 要遍歷的集合
6. item: 當(dāng)前正在遍歷的對(duì)象的變量名
7. open: 開(kāi)始遍歷
8. close: 結(jié)束便利
9. index: 下標(biāo)
10. separator: 分割
11. -- >
12. <foreach collection = "array" item = "item" open = "(" close = ")" index = "index" separator = "," >
13. #{item}
14. </foreach>
15.
16. </select>
熟練掌握以上 Mysql 的動(dòng)態(tài) SQL , 我們可以更得心應(yīng)手的完成我的功能,寫(xiě)更少的代碼,實(shí)現(xiàn)更多的功能。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。