使用JdbcTemplate执行DELETE语句无效果:无报错但未删除数据
排查JdbcTemplate DELETE无效果但INSERT正常的问题
我之前也碰到过类似的诡异情况,结合你的代码和现象,给你几个实用的排查方向和解决方案:
1. 先确认SQL是否真的匹配到数据
首先,你可以在delete方法里加上日志,打印执行的SQL、参数以及受影响的行数——这是最直接的排查方式:
@Override public void deleteEntry(long id) { String deleteQuery = "DELETE FROM company WHERE id = ?"; // 打印关键信息用于排查 System.out.println("准备执行删除SQL: " + deleteQuery); System.out.println("删除目标ID: " + id); int rowsAffected = jdbcTemplate.update(deleteQuery, id); System.out.println("删除操作影响行数: " + rowsAffected); if (rowsAffected == 0) { System.out.println("⚠️ 没有找到对应ID的数据,删除无效果"); } }
如果打印出rowsAffected == 0,那说明你的参数id在数据库里根本找不到对应的数据——这时候要检查传入的id是否正确,或者数据库里的数据是否被其他操作修改了。
2. 排查事务是否被回滚
如果rowsAffected显示为1,但数据库里的数据还在,那大概率是事务没有提交或者被回滚了:
- 检查你的
deleteEntry方法是否被@Transactional注解修饰,如果是,看看方法内部有没有try-catch块吞掉了异常——Spring事务默认会在抛出RuntimeException时回滚,如果异常被你吞了,事务也会悄悄回滚,导致删除操作失效。 - 举个反例:如果你的方法里有这样的代码,就会导致事务回滚但你看不到报错:
@Transactional @Override public void deleteEntry(long id) { try { String deleteQuery = "DELETE FROM company WHERE id = ?"; jdbcTemplate.update(deleteQuery, id); // 这里抛出了异常但被吞了 throw new RuntimeException("测试异常"); } catch (Exception e) { // 只打印日志不抛出,事务会回滚 e.printStackTrace(); } }
解决方法:要么去掉try-catch让异常正常抛出,要么在catch块里明确处理事务逻辑(不推荐随意修改,除非你明确知道自己在做什么)。
3. 检查参数类型与数据库字段是否匹配
虽然你的INSERT语句正常,但还是要确认下:
- 数据库里的
id字段是什么类型?如果是INT,你传入的long类型理论上可以自动转换,但如果id字段是VARCHAR(虽然不推荐这么设计),那传入数字类型的long就会匹配不到数据。 - 可以试试把参数改成
Integer(如果你的id范围在int内),或者用PreparedStatementSetter手动指定参数类型:
jdbcTemplate.update(deleteQuery, new PreparedStatementSetter() { @Override public void setValues(PreparedStatement ps) throws SQLException { ps.setLong(1, id); } });
4. 验证SQL语法与表名正确性
虽然INSERT正常,但也要排除大小写或者表名写错的问题:
- 比如有些数据库(如MySQL在Linux下)是表名大小写敏感的,如果你的实际表名是
Company而不是company,那DELETE语句会执行但不会影响任何行(不过这种情况通常会报错,概率较低,但可以手动在数据库执行一遍你打印的SQL,看能不能删除)。
内容的提问来源于stack exchange,提问作者lukaszgo3
相关产品推荐
相关产品推荐

