建议先查看官方文档:mybatis
我们经常会在mybatis操作中用到where和<if></if>标签,如下所示:
<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>
</select>
如果这些条件没有一个能匹配上会发生什么?最终这条 SQL 会变成这样:
SELECT * FROM BLOG
WHERE
这会导致查询失败。如果仅仅第二个条件匹配又会怎样?这条 SQL 最终会是这样:
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
这也是一条错误的语句,多了一个AND。
MyBatis 有一个简单的处理,这在 90% 的情况下都会有用。而在不能使用的地方,你可以自定义处理方式来令其正常工作。一处简单的修改就能达到目的,用<where></where>标签:<where> 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,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>标签没有生效怎么办?这个时候就引入了<trim>的概念。
<trim>是什么?
trim的英文名是修剪、整理的意思。正如它的英文名所译,对SQL语句进行修剪,即添加前缀(后缀)或者去除掉多余的前缀(后缀)。
<trim>的使用:
prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它的作用是移除所有指定在 prefixOverrides 属性中的内容,并且插入 prefix 属性中指定的内容。
prefix:前缀
prefixoverride:去掉第一个and或者是or
suffixOverrides:去掉最后一个XXX
举个例子一:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
select * from user
<trim prefix="WHERE" prefixoverride="AND |OR">
<if test="name != null and name.length()>0"> AND name=#{name}</if>
<if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>
等同于,下面的语句(自动在前面添加where,去除掉第一个AND或者OR)
select * from user
where
name = 'xx'
and
gender = 'xx'
举个例子二:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
<update id="updateAuthorIfNecessary">
update Author
<trim prefix="SET" suffixOverrides=",">
<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>
</trim>
where id=#{id}
</update>
等同于,下面的语句(set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号,因为用了条件语句之后很可能就会在生成的 SQL 语句的后面留下这些逗号。)
<update id="updateAuthorIfNecessary">
update Author
set
username=#{username},
password=#{password},
email=#{email},
bio=#{bio}
where id=#{id}
</update>
欢迎加入 CSDN技术交流群:(点击即可加群)QQ群:681223095。
因经常有人留言,未能及时查看到和回复,所以特建此群,以方便交流。方便问题讨论,有问题和没有问题的小伙伴均可加入,用作自我学习和共同进步。本博主不一定长期在线,但是qq群里会有很多热心的小伙伴,大家一起讨论解决问题。