mapper foreach 多字段更新

<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);
    }
}

 

posted @ 2025-12-02 15:41  liliyou  阅读(5)  评论(0)    收藏  举报