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

如何通过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;
}

额外检查项

  1. 确认QuizDTO中的id字段能正确接收Postman传入的小写"id",如果DTO使用驼峰命名,可添加@JsonProperty("id")注解确保映射正确;
  2. 执行更新后可打印jdbcTemplate.update的返回值,该值代表被修改的行数,若返回0则说明没有匹配到对应ID的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:50:28