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
相关产品推荐
相关产品推荐

