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

JDBC报错:无法为SELECT语句调用executeupdate()求助

解决JDBC报错:can not issue executeupdate() for selects

嘿,这个问题我太熟了!你遇到的报错其实是个典型的JDBC使用误区——你写了查询语句(SELECT)却调用了executeUpdate()方法,这俩完全不匹配!

问题根源

JDBC里的方法分工很明确:

  • executeUpdate():专门用来执行INSERT、UPDATE、DELETE这类修改数据的语句,或者CREATE、DROP这类数据库结构变更语句,它返回的是受影响的行数。
  • executeQuery():才是用来执行SELECT查询语句的,它会返回ResultSet结果集,供你读取查询到的数据。

你贴的代码里写的是String Sql="Select * from training where trainID=? ";,如果这段代码后面你调用了executeUpdate(),那必然会触发这个错误。

针对性解决方案

分两种情况处理:

情况1:你本来就是要查询数据

把执行方法改成executeQuery(),并处理返回的结果集,示例代码如下:

String sql = "SELECT * FROM training WHERE trainID=?";
try {
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hr","root","你的密码");
    // 预编译SQL,防止SQL注入
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.setInt(1, 123); // 这里替换成你要查询的trainID值
    // 用executeQuery()执行查询,获取结果集
    ResultSet rs = pstmt.executeQuery();
    // 遍历结果集读取数据
    while(rs.next()){
        String trainName = rs.getString("trainName");
        Date startDate = rs.getDate("startDate");
        // 根据你的表字段,继续读取其他数据
        System.out.println("培训名称:" + trainName);
    }
    // 记得关闭资源(最好用try-with-resources自动关闭,这里简化写法)
    rs.close();
    pstmt.close();
    con.close();
} catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
}

情况2:你本来是要执行更新操作

那得把SQL语句改成UPDATE语句,再用executeUpdate()执行,示例代码:

// 比如更新培训名称
String sql = "UPDATE training SET trainName=? WHERE trainID=?";
try {
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hr","root","你的密码");
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.setString(1, "Java进阶培训"); // 设置要更新的字段值
    pstmt.setInt(2, 123); // 设置更新条件的trainID
    // 执行更新,获取受影响的行数
    int affectedRows = pstmt.executeUpdate();
    System.out.println("成功更新了" + affectedRows + "条记录");
    // 关闭资源
    pstmt.close();
    con.close();
} catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
}

小提醒

以后写JDBC代码时,一定要对应好语句类型和执行方法:查询用executeQuery(),增删改/结构变更用executeUpdate(),这样就不会再踩这个坑啦!

内容的提问来源于stack exchange,提问作者z.allawati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:55:34