如何通过ID在JDBC中更新MySQL数据?请求排查代码问题
问题排查:MySQL数据更新失败
问题描述
尝试通过行ID更新MySQL数据库数据,但新值未写入数据库,已调试代码未发现问题,使用Postman传递JSON测试。
相关代码
Repo层(JDBC实现)
@Repository public class QuizRepositoryJDBC implements QuizRepository{ private static final String UPDATE_QUESTION = "UPDATE Quiz SET type=?, level=?, choiceNum=?, question=?, choiceA=?, choiceB=?, " + "choiceC=?, choiceD=?, correct=?, hint=? WHERE ID=?"; private static final String DELETE_QUESTION_BY_ID = "DELETE FROM Quiz WHERE ID=?"; private JdbcTemplate jdbcTemplate; @Autowired(required = false) public QuizRepositoryJDBC(JdbcTemplate aTemplate){ jdbcTemplate = aTemplate; } @Override public QuizDTO updateQuestion(QuizDTO quizDTO) { jdbcTemplate.update(UPDATE_QUESTION, quizDTO.getID(), quizDTO.getType(), quizDTO.getLevel(), quizDTO.getChoiceNum(),quizDTO.getQuestion(), quizDTO.getChoiceA(), quizDTO.getChoiceB(), quizDTO.getChoiceC(), quizDTO.getChoiceD(), quizDTO.getCorrect(), quizDTO.getHint()); return quizDTO; } @Override public String deleteQuestion(int id) { jdbcTemplate.update(DELETE_QUESTION_BY_ID, id); return "Deleted question with id:" + id; } }
Controller层
@RestController public class QuizController { private QuizRepository quizRepo; @Autowired public QuizController(QuizRepository pRepo) { quizRepo = pRepo; } @PutMapping("/adminupdate") public QuizDTO updateQuestion(@RequestBody QuizDTO quizDTO) { return quizRepo.updateQuestion(quizDTO); } @DeleteMapping("/admindelete/{id}") public String deleteQuestion(@PathVariable("id") int id){ return quizRepo.deleteQuestion(id); } }
Postman传入的JSON
{ "id": 104, "type":"epidemics", "level":1, "choiceNum":4, "question":"another one question", "choiceA": "no1", "choiceB":"yes2", "choiceC":"no3", "choiceD":"yes4", "correct":"no1", "hint":"second answer" }
问题根源
SQL语句的占位符顺序与jdbcTemplate.update传入的参数顺序完全不匹配:
- SQL中
UPDATE的占位符顺序是:type,level,choiceNum,question,choiceA,choiceB,choiceC,choiceD,correct,hint,最后是WHERE ID=? - 但代码中第一个传入的参数是
quizDTO.getID(),导致ID被赋值给了type字段,后续参数全部错位,最终WHERE ID=?对应的是hint的值(即"second answer"),数据库中不存在ID为该值的行,因此没有数据被更新。
修复方案
调整jdbcTemplate.update的参数顺序,使其与SQL占位符顺序一致,最后传入ID:
@Override public QuizDTO updateQuestion(QuizDTO quizDTO) { jdbcTemplate.update(UPDATE_QUESTION, quizDTO.getType(), quizDTO.getLevel(), quizDTO.getChoiceNum(), quizDTO.getQuestion(), quizDTO.getChoiceA(), quizDTO.getChoiceB(), quizDTO.getChoiceC(), quizDTO.getChoiceD(), quizDTO.getCorrect(), quizDTO.getHint(), quizDTO.getID()); // ID放在最后匹配WHERE条件 return quizDTO; }
额外检查项
- 确认
QuizDTO中的id字段能正确接收Postman传入的小写"id",如果DTO使用驼峰命名,可添加@JsonProperty("id")注解确保映射正确; - 执行更新后可打印
jdbcTemplate.update的返回值,该值代表被修改的行数,若返回0则说明没有匹配到对应ID的行。
内容的提问来源于stack exchange,提问作者SFleevo
相关产品推荐
相关产品推荐

