SpringBoot+MyBatis实现动态字段更新的三种方法
在Spring Boot和MyBatis中,实现动态更新不固定字段的步骤如下:
方法一:使用MyBatis动态SQL(适合字段允许为null的场景)
定义实体类
包含所有可能被更新的字段。
Mapper接口
定义更新方法,参数为实体对象:
void updateUserSelective(User user);
XML映射文件
使用<set>和<if>动态生成SQL:
<update id="updateUserSelective" parameterType="User">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
<if test="address != null">address = #{address},</if>
<if test="phone != null">phone = #{phone},</if>
</set>
WHERE id = #{id}
</update>注意:此方法无法将字段更新为null,因为参数为null时条件不成立。
方法二:使用Map和字段过滤(支持字段更新为null)
Service层过滤字段
在Service中定义允许更新的字段,并过滤请求参数:
public void updateUser(Long id, Map<String, Object> updates) {
Set<String> allowedFields = Set.of("name", "age", "address", "phone");
updates.keySet().retainAll(allowedFields); // 过滤非法字段
userMapper.updateUserSelective(id, updates);
}Mapper接口
使用Map接收动态字段:
void updateUserSelective(@Param("id") Long id, @Param("updates") Map<String, Object> updates);XML映射文件
动态生成更新语句:
<update id="updateUserSelective">
UPDATE user
<set>
<foreach collection="updates" index="key" item="value" separator=",">
${key} = #{value}
</foreach>
</set>
WHERE id = #{id}
</update>注意:使用${key}存在SQL注入风险,需在Service层严格过滤字段名。
方法三:使用@UpdateProvider(灵活且安全)
定义SQL提供类
动态构建安全SQL:
public class UserSqlProvider {
public String updateSelective(Map<String, Object> params) {
Long id = (Long) params.get("id");
Map<String, Object> updates = (Map<String, Object>) params.get("updates");
Set<String> allowedFields = Set.of("name", "age", "address", "phone");
StringBuilder sql = new StringBuilder("UPDATE user SET ");
allowedFields.forEach(field -> {
if (updates.containsKey(field)) {
sql.append(field).append(" = #{updates.").append(field).append("}, ");
}
});
sql.setLength(sql.length() - 2); // 移除末尾逗号
sql.append(" WHERE id = #{id}");
return sql.toString();
}
}Mapper接口
使用@UpdateProvider注解:
@UpdateProvider(type = UserSqlProvider.class, method = "updateSelective")
void updateUserSelective(@Param("id") Long id, @Param("updates") Map<String, Object> updates);优点:避免SQL注入,动态生成安全语句。
总结
方法一适合简单场景,字段无需设置为
null。方法二灵活,需严格过滤字段。
方法三推荐用于生产环境,安全且维护性强。
根据需求选择合适方案,确保字段更新的灵活性和安全性。
到此这篇关于SpringBoot+MyBatis实现动态字段更新的三种方法的文章就介绍到这了,更多相关SpringBoot MyBatis字段更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决MyEclipse10.7部署报错抛空指针异常问题的方法
这篇文章主要介绍了解决MyEclipse10.7部署报错抛空指针异常问题的方法,需要的朋友可以参考下2015-12-12
Docker Compose+Jenkins自动化部署流程图文教程
Jenkins是一款非常流行的开源持续集成工具,广泛用于项目开发,具有自动化构建、测试和部署等功能,这篇文章主要介绍了Docker Compose+Jenkins自动化部署流程的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下2026-04-04
Java获取项目路径方式System.getProperty(“user.dir“)
这篇文章主要介绍了Java获取项目路径方式System.getProperty(“user.dir“),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-12-12
Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用
前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议2021-05-05
Spring中@Transactional注解关键属性和用法小结
在Spring框架中,@Transactional 是一个注解,用于声明事务性的方法,它提供了一种声明式的事务管理方式,避免了在代码中直接编写事务管理相关的代码,本文给大家介绍@Transactional 注解的一些关键属性和用法,感兴趣的朋友一起看看吧2023-12-12
idea启动与jar包启动中使用resource资源文件路径的问题
这篇文章主要介绍了idea启动与jar包启动中使用resource资源文件路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-07-07


最新评论