You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot中如何为SQL删除语句正确传递id参数?

问题分析与解决方案

你的代码问题在于:使用@id作为命名参数后,直接调用dbTemplate.execute(sql)并没有传递参数值,SQL中的@id不会被解析替换,导致删除条件无效;而写死静态值时SQL本身合法,所以能正常执行。

下面是两种正确传递参数的方式:

方式一:使用JdbcTemplate的带参数update方法(占位符?)

这是JdbcTemplate最常用的参数绑定方式,用?作为占位符,通过update方法传入参数,同时可以通过返回的影响行数判断是否实际删除了记录:

public boolean deleteInterest(int id) {
    boolean isDeleted = false;
    String sql = "DELETE FROM user_interests WHERE user_id = ?";
    
    if(userRepository.findById(id) != null) {
        int affectedRows = dbTemplate.update(sql, id);
        isDeleted = affectedRows > 0; // 只有实际删除了记录才返回true
    }
    
    return isDeleted;
}

方式二:使用NamedParameterJdbcTemplate支持命名参数@id

如果想保留@id这种更直观的命名参数写法,需要使用NamedParameterJdbcTemplate,它专门支持解析命名参数:

// 先注入NamedParameterJdbcTemplate(由Spring容器管理,用法和JdbcTemplate一致)
private final NamedParameterJdbcTemplate namedJdbcTemplate;

public boolean deleteInterest(int id) {
    boolean isDeleted = false;
    String sql = "DELETE FROM user_interests WHERE user_id = @id";
    
    if(userRepository.findById(id) != null) {
        Map<String, Object> params = new HashMap<>();
        params.put("id", id);
        int affectedRows = namedJdbcTemplate.update(sql, params);
        isDeleted = affectedRows > 0;
    }
    
    return isDeleted;
}

额外说明

  • 不要用execute方法执行带参数的SQL,它不会处理参数占位符,仅适合执行无参数的SQL语句。
  • 使用参数绑定的方式可以避免SQL注入风险,比直接拼接字符串(比如"user_id = " + id)更安全。
  • 通过update方法返回的影响行数判断删除是否成功,比单纯判断用户ID存在更准确,因为可能存在用户ID存在但没有对应user_interests记录的情况。

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:35:36