<update id="batchUpdateDynamic">
UPDATE user
SET
<foreach collection="fields" item="field" separator=",">
${field.name} = #{field.value}
</foreach>
WHERE id = #{id}
</update>
// Java实体类
@Data
public class UpdateField {
private String name; // 字段名,如:"username", "email"
private Object value; // 字段值
}
// Mapper接口
int batchUpdateDynamic(@Param("id") Long id,
@Param("fields") List<UpdateField> fields);
版本2:使用Map更灵活
<update id="batchUpdateByMap">
UPDATE ${tableName}
SET
<foreach collection="updateMap" item="value" index="key" separator=",">
${key} = #{value}
</foreach>
WHERE id = #{id}
</update>
// Mapper接口
int batchUpdateByMap(@Param("tableName") String tableName,
@Param("id") Long id,
@Param("updateMap") Map<String, Object> updateMap);
版本5:使用trim处理逗号
<update id="batchUpdateWithTrim">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<foreach collection="fields" item="field">
<if test="field.name != null and field.value != null">
${field.name} = #{field.value},
</if>
</foreach>
</trim>
WHERE id = #{id}
</update>
版本6:结合注解使用(更灵活)
// 使用@UpdateProvider实现动态SQL
@UpdateProvider(type = UserSqlProvider.class, method = "buildBatchUpdateSql")
int batchUpdateUser(@Param("id") Long id,
@Param("fields") Map<String, Object> fields);
// SQL提供类
public class UserSqlProvider {
public String buildBatchUpdateSql(Map<String, Object> params) {
Long id = (Long) params.get("id");
Map<String, Object> fields = (Map<String, Object>) params.get("fields");
StringBuilder sql = new StringBuilder("UPDATE user SET ");
List<String> updates = new ArrayList<>();
for (Map.Entry<String, Object> entry : fields.entrySet()) {
// 这里可以对字段名做安全检查
if (isValidField(entry.getKey())) {
updates.add(entry.getKey() + " = #{fields." + entry.getKey() + "}");
}
}
sql.append(String.join(", ", updates));
sql.append(" WHERE id = #{id}");
return sql.toString();
}
private boolean isValidField(String fieldName) {
// 定义允许更新的字段
Set<String> allowedFields = new HashSet<>(Arrays.asList(
"username", "email", "age", "status", "phone"
));
return allowedFields.contains(fieldName);
}
}