Mybatis3(3)动态 SQL
可以利用動態SQL擺脫憑借SQL語句的痛苦。
 MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基于 OGNL 的表達式來淘汰其它大部分元素。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
if
動態 SQL 通常要做的事情是根據條件包含 where 子句的一部分。
<select id="findActiveBlogWithTitleLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if> </select>如果希望通過“title”和“author”兩個參數進行可選搜索該怎么辦呢?首先,改變語句的名稱讓它更具實際意義;然后只要加入另一個條件即可。
<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if> </select>choose, when, otherwise
有點像java的switch,只能選一項。
 下面的例子說明要么按title查找,要么按author查找。
trim, where, set
在上面例子中,如果沒有一個匹配上,則sql會變成:
SELECT * FROM BLOG WHERE或僅僅第二個條件匹配會變成:
SELECT * FROM BLOG WHERE AND title like ‘someTitle’Mybatis的 where 標簽 可以解決這樣的問題。
<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG <where> <if test="state != null">state = #{state}</if> <if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where> </select>where 元素只會在至少一個子素的條件下才會插入“where”子句,若語句開頭為“and”或“or”,where元素也會將其去除。
trim 元素用來定制 where 元素的功能。
<trim prefix="WHERE" prefixOverrides="AND |OR ">... </trim>類似的用于動態更新語句的解決方案叫做 set。
<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id} </update>set 元素會動態前置 SET 關鍵字,同時也會刪掉無關的逗號。比如,低四條沒有時會余留逗號。
set的trim寫法如下
<trim prefix="SET" suffixOverrides=",">... </trim>注意這里我們刪去的是后綴值,同時添加了前綴值。
foreach
動態 SQL 的另外一個常用的操作需求是對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。
<select id="selectPostIn" resultType="domain.blog.Post">SELECT *FROM POST PWHERE ID in<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach> </select>foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及在迭代結果之間放置分隔符。
你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數組對象傳遞給 foreach 作為集合參數。當使用可迭代對象或者數組時,index 是當前迭代的次數,item 的值是本次迭代獲取的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。
bind
bind 元素可以從 OGNL 表達式中創建一個變量并將其綁定到上下文。比如:
<select id="selectBlogsLike" resultType="Blog"><bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />SELECT * FROM BLOGWHERE title LIKE #{pattern} </select>多數據庫支持
一個配置了“_databaseId”變量的 databaseIdProvider 可用于動態代碼中,這樣就可以根據不同的數據庫廠商構建特定的語句。
<insert id="insert"><selectKey keyProperty="id" resultType="int" order="BEFORE"><if test="_databaseId == 'oracle'">select seq_users.nextval from dual</if><if test="_databaseId == 'db2'">select nextval for seq_users from sysibm.sysdummy1"</if></selectKey>insert into users values (#{id}, #{name}) </insert>動態SQL中的可插拔腳本語言
MyBatis 從 3.2 開始支持可插拔腳本語言,這允許你插入一種腳本語言驅動,并基于這種語言來編寫動態 SQL 查詢語句。
 詳情:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html
總結
以上是生活随笔為你收集整理的Mybatis3(3)动态 SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: lol符文灵性猎手的效果(lol天赋灵性
- 下一篇: 造梦西游3电脑版法宝(造梦西游3电脑版法
