mybatis 动态update语句

本文介绍了如何在Mybatis中使用动态SQL进行更新操作,展示了一个完整的`updateOne`方法,该方法根据传入的对象属性动态设置UPDATE语句的SET部分,并提供了不同字段不为空时的条件判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<update id="updateOne" parameterType="com.inspur.search.data.EntityRelation">

    UPDATE ENTITY_RELATION

        <trim prefix="set" suffixOverrides=",">

        <if test="srcId!=null">SRC_ID=#{srcId},</if>

        <if test="srcType!=null">SRC_TYPE=#{srcType},</if>

        <if test="destId!=null">DEST_ID=#{destId},</if>

        <if test="destType!=null">DEST_TYPE=#{destType},</if>

        <if test="relType!=null">REL_TYPE=#{relType},</if>

        <if test="status!=null">STATUS=#{status},</if>

        <if test="snId!=null">SN_ID=#{snId},</if>

    </trim>

    WHERE id=#{id}

</update>

### MyBatis 中构建动态 UPDATE 语句MyBatis 中,可以通过 `<if>` 标签来实现动态 SQL 的条件判断功能。这使得可以根据 Java 对象中的属性值决定是否包含某些字段更新操作[^3]。 下面是一个完整的动态 `UPDATE` 语句示例: #### XML 配置方式 ```xml <update id="dynamicUpdateUser" parameterType="map"> UPDATE users <set> <if test="username != null">username = #{username},</if> <if test="email != null">email = #{email},</if> <if test="age != null">age = #{age}</if> </set> WHERE id = #{id} </update> ``` 在这个例子中: - 使用了 `<set>` 标签自动处理逗号分隔符的问题。 - 如果某个参数为空,则对应的字段不会被纳入到最终的 SQL 更新语句中[^4]。 #### 注解方式 (推荐配合 `@UpdateProvider`) 如果更倾向于使用注解形式定义 SQL 而不是 XML 文件,可以采用如下方法: ```java public class UserSqlProvider { public String dynamicUpdateUser(Map<String, Object> param) { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("UPDATE users SET "); boolean hasCondition = false; if(param.get("username") != null){ if(hasCondition){ sqlBuilder.append(","); } sqlBuilder.append(" username = #{username} "); hasCondition = true; } if(param.get("email") != null){ if(hasCondition){ sqlBuilder.append(","); } sqlBuilder.append(" email = #{email} "); hasCondition = true; } if(param.get("age") != null){ if(hasCondition){ sqlBuilder.append(","); } sqlBuilder.append(" age = #{age} "); } sqlBuilder.append("WHERE id = #{id}"); return sqlBuilder.toString(); } } // Mapper 接口 @Mapper public interface UserMapper { @UpdateProvider(type=UserSqlProvider.class, method="dynamicUpdateUser") int dynamicUpdateUser(@Param("id") Integer id, @Param("username") String username, @Param("email") String email, @Param("age") Integer age); } ``` 上述代码展示了如何通过自定义 SQL 提供者类 (`UserSqlProvider`) 和 `@UpdateProvider` 注解完成动态 SQL 的编写[^2]。 --- #### 注意事项 1. **防止 SQL 注入**:始终使用 `#{}` 占位符绑定变量,而不是直接拼接字符串[^1]。 2. **性能优化**:当涉及大量字段时,建议仅传递需要修改的数据项以减少不必要的数据库开销。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值