動態sql
- if元素
if元素相當於Java中的if語句,它常常與test屬性聯合使用。現在我們要根據name去查找學生,但是name是可選的,如下所示:
<select id="selectByName" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
WHERE 1=1
<if test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</if>
</select>
- choose、when、otherwise元素
有些時候我們還需要多種條件的選擇,在Java中我們可以使用switch、case、default語句,而在映射器的動態語句中可以使用choose、when、otherwise元素。
<!-- 有name的時候使用name搜索,沒有的時候使用id搜索 -->
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
WHERE 1=1
<choose>
<when test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</when>
<when test="id != null">
AND id = #{id}
</when>
</choose>
</select>
- where元素
上面的select語句我們加了一個1=1
的絕對true的語句,目的是爲了防止語句錯誤,變成SELECT * FROM student WHERE這樣where後沒有內容的錯誤語句。這樣會有點奇怪,此時可以使用<where>
元素。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
<where>
<if test="name != null and name != ''">
name LIKE concat('%', #{name}, '%')
</if>
<if test="title != null and titlr != ''">
and lower(title) like lower(#{title})
</if>
</where>
</select>
<where>自動修補查詢條件,查詢語句中的where關鍵字使用<where>標籤替代
注意:不能省略and 或 or關鍵字
- set元素
在update語句中,如果我們只想更新某幾個字段的值,這個時候可以使用set元素配合if元素來完成。注意:set元素遇到,會自動把,去掉。
<update id="update">
UPDATE student
<set>
<if test="name != null">
name = #{name},
</if>
<if test="sex != null">
sex = #{sex}
</if>
</set>
WHERE id = #{id}
</update>
按需修改,修改指定的列,未指定的不修改
- trim元素
有時候我們要去掉一些特殊的SQL語法,比如常見的and、or,此時可以使用trim元素。trim元素意味着我們需要去掉一些特殊的字符串,prefix代表的是語句的前綴,而prefixOverrides代表的是你需要去掉的那種字符串,suffix表示語句的後綴,suffixOverrides代表去掉的後綴字符串。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
<trim prefix="WHERE" prefixOverrides="AND">
<if test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</if>
<if test="id != null">
AND id = #{id}
</if>
</trim>
</select>
- foreach元素
foreach元素是一個循環語句,它的作用是遍歷集合,可以支持數組、List、Set接口。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
WHERE name IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item}
</foreach>
collection配置的是傳遞進來的參數名稱,它可以是一個數組、List、Set等集合。
item配置的是循環中當前的元素。
open和close配置的是以什麼符號將這些集合包裝起來。
separator是各個元素的間隔符。