mybatis-動態sql-trim、where、set

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"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章