《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語句。
查詢要求:
- 當角色編號不為空,則根據角色編號查詢
- 當角色編號為空,而角色名稱不為空,則根據角色名稱模糊查詢
- 當角色編號和角色名稱均為空,則要求角色備注不為空
(3)trim、where、set元素
細心的讀者可以發現上面的查詢加入了一個條件”1=1“。若沒有這個條件,可能會出問題。
如果我們使用<where>就可以輕松解決這個問題了,當where中元素條件成立時,會給SQL語句自動加上where關鍵字,否則不加入。
當然,方式不止一種,除了使用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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Servlet】Servlet与MVC
- 下一篇: 《MyBatis技术原理与实战》之Sql