1. where標簽的作用:如果該標簽包含的元素中有返回值,就插入一個where;如果where后面的字符是以AND和OR開頭的,就講他們剔除。
int findUserByWhere(@Param("name") String name, @Param("phone") String phone);
<select id="findUserByWhere" resultType="User"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name LIKE concat('%', #{name}, '%') </if> <if test="phone !=null and phone !=''"> OR phone=#{phone} </if> </where> </select>
如果兩個if條件不滿足的時候,where標簽包着的這一段代碼就會被剔除掉,在SQL中就不會出現這一段代碼。
2.set標簽的作用:如果該標簽包含的元素中有返回值,就插入一個set;如果set后面的字符串是以逗號結尾的,就將這個逗號剔除。
int updateUser(@Param("user") User user);
<update id="updateUser"> UPDATE user <set> <if test="user.email != null and user.email != ''">email=#{user.email},</if> <if test="user.phone != null and user.phone != ''">phone=#{user.phone},</if> </set> WHERE uid=#{user.uid} </update>
注意最后的WHERE uid=#{user.uid}不可省略的,如果set包含的內容為空,只能避免最后遺留的逗號問題
3.trim用法:
<trim>標簽屬性:
- prefix:當trim元素包含內容時,會給內容增加prefix指定的前綴
- prefixOverride:當trim元素包含內容時,會把內容中匹配的前綴字符串去掉。
- suffix:當trim元素包含內容時,會給內容增加prefix指定的后綴
- suffixOverride:當trim元素包含內容時,會把內容中匹配的后綴字符串去掉。
<where>和<set>標簽都可以用trim標簽實現,並且底層就是通過TrimSqlNode實現的。
<where>標簽對應的trim實現:
<trim prefix="WHERE" prefixOverride="AND |OR ">
例子:
<select id="findUserByTrimWhere" resultMap="BaseResultMap"> SELECT * FROM user <trim prefix="WHERE" prefixOverrides="AND | OR"> <if test="name != null and name != '' "> AND NAME LIKE concat('%', #{name}, '%') </if> <if test="phone !=null and phone !=''"> OR phone=#{phone} </if> </trim> </select>
<set>標簽對應的trim實現:
<trim prefix="SET" suffixOverrides=",">
例子:
<update id="updateUserTrim"> UPDATE user <trim prefix="SET" suffixOverrides=","> <if test="user.email != null and user.email != ''">email=#{user.email},</if> <if test="user.phone != null and user.phone != ''">phone=#{user.phone}</if> </trim> WHERE uid =#{user.uid} </update>
提示:
prefixOverride中AND和OR后面的空格不能省略,為了避免匹配到andes或orders等單詞。實際上prefixOverride包含"AND""OR""AND\n""OR\n""AND\r""OR\r""AND\t""OR\t"