mybatis where trim标签

使用mybatis写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>
</select>

如果这些条件没有一个能匹配上将会怎样?最终这条 SQL 会变成这样:

SELECT * FROM BLOG
WHERE

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

SELECT * FROM BLOG
WHERE 
AND title like ‘yiibai.com’

这个查询也会失败。这个问题不能简单的用条件句式来解决,如果你也曾经被迫这样写过,那么你很可能从此以后都不想再这样去写了。

MyBatis 有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式来令其正常工作。一处简单的修改就能得到想要的效果:

<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 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:

<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
### MyBatis 中 `trim` 标签的使用方法与示例 MyBatis 的 `trim` 标签主要用于动态生成 SQL 语句,能够灵活地处理前缀、后缀以及多余的分隔符(如逗号或 `AND` 等)。通过该标签,可以实现条件查询、插入、更新等操作时 SQL 语句的动态构建[^1]。 #### 属性说明 `trim` 标签包含以下主要属性: - **prefix**:指定 SQL 语句的前缀,例如 `WHERE` 或 `SET`。 - **suffix**:指定 SQL 语句的后缀,例如 `)`。 - **prefixOverrides**:移除前缀中的多余内容,例如移除多余的 `AND` 或 `OR`。 - **suffixOverrides**:移除后缀中的多余内容,例如移除多余的逗号 `,`。 #### 示例代码 ##### 1. 动态生成 `WHERE` 条件 以下示例展示了如何使用 `trim` 标签动态生成 `WHERE` 子句: ```xml <select id="selectUsers" resultType="User"> SELECT * FROM users <trim prefix="WHERE" prefixOverrides="AND |OR "> <if test="id != null"> AND id = #{id} </if> <if test="name != null and name != ''"> AND name LIKE #{name} </if> <if test="age > 0"> AND age = #{age} </if> </trim> </select> ``` 如果所有条件都不满足,则不会生成任何 `WHERE` 子句[^3]。 ##### 2. 插入数据时动态生成字段列表 在插入数据时,`trim` 标签可以动态生成字段列表和对应的值列表: ```xml <insert id="insertUser"> INSERT INTO users <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null">id,</if> <if test="name != null">name,</if> <if test="age != null">age,</if> </trim> VALUES <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null">#{id},</if> <if test="name != null">#{name},</if> <if test="age != null">#{age},</if> </trim> </insert> ``` 此示例中,`suffixOverrides=","` 用于移除最后一个逗号[^4]。 ##### 3. 更新数据时动态生成 `SET` 子句 在更新数据时,`trim` 标签可以动态生成 `SET` 子句: ```xml <update id="updateUser"> UPDATE users <trim prefix="SET" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="age != null">age = #{age},</if> </trim> WHERE id = #{id} </update> ``` 此示例中,`suffixOverrides=","` 用于移除最后一个逗号[^4]。 #### 注意事项 - 如果 `trim` 标签内部的所有条件都不满足,则不会生成任何内容。 - `prefixOverrides` 和 `suffixOverrides` 用于移除多余的符号,确保生成的 SQL 语句语法正确。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值