如果没有匹配的条件会怎么样?最终这条 SQL 会变成这样:

    1. WHERE

    这会导致查询失败。如果匹配的只是第二个条件又会怎样?这条 SQL 会是这样:

    这个查询也会失败。这个问题不能简单地用条件元素来解决。这个问题是如此的难以解决,以至于解决过的人不会再想碰到这种问题。

    1. <select id="findActiveBlogLike"
    2. resultType="Blog">
    3. SELECT * FROM BLOG
    4. <where>
    5. <if test="state != null">
    6. state = #{state}
    7. AND title like #{title}
    8. </if>
    9. <if test="author != null and author.name != null">
    10. AND author_name like #{author.name}
    11. </if>
    12. </where>
    13. </select>

    where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

    如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:

    prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。

    1. <set>
    2. <if test="username != null">username=#{username},</if>
    3. <if test="password != null">password=#{password},</if>
    4. <if test="email != null">email=#{email},</if>
    5. <if test="bio != null">bio=#{bio}</if>
    6. </set>
    7. where id=#{id}

    这个例子中,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

    或者,你可以通过使用trim元素来达到同样的效果:

    注意,我们覆盖了后缀值设置,并且自定义了前缀值。