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

Java使用PreparedStatement执行SELECT查询出现语法错误及返回空值问题

问题原因和修复方案
  • 错误1:PreparedStatement 执行查询时错误传入SQL参数
    你已经通过 cnx.prepareStatement(sql) 完成了SQL语句的预编译,并且调用setString替换了占位符,执行时直接调用无参的stmt.executeQuery()即可。额外传入sql参数会直接执行未替换?占位符的原始语句,直接触发SQL语法错误。
  • 错误2:结果集取值逻辑完全颠倒
    你在rst.next()的循环中,错误调用stmt.setString()给预编译语句设参数,这是SELECT查询,不需要再给Statement设参数,应该从ResultSet对象中读取查询到的字段值,赋值给Entreprise对象的对应属性。你当前代码中刚初始化的Entreprise对象所有属性都是null,自然返回结果为空。
  • 额外问题:你当前没有正确处理查询无结果的场景,且字段取值没有对应数据库返回的字段名,容易出现取值错误,另外建议补充资源关闭逻辑避免数据库连接泄漏。

修正后的代码如下:

public Entreprise loadDataModify(String id) { 
    Entreprise e = new Entreprise();
    PreparedStatement stmt = null;
    ResultSet rst = null;
    try {
        String sql = "SELECT * FROM user WHERE mail=?";
        stmt = cnx.prepareStatement(sql);
        stmt.setString(1, id);
        // 调用无参executeQuery执行预编译后的SQL
        rst = stmt.executeQuery();
        // 按mail查询最多返回一条结果,用if判断即可无需while循环
        if (rst.next()) {
            // 从结果集取字段赋值给e的属性,字段名请和你数据库user表的实际字段名对应调整
            e.setNom(rst.getString("nom"));
            e.setEmail(rst.getString("email"));
            e.setTel(rst.getString("tel"));
            e.setOffre(rst.getString("offre"));
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        // 关闭ResultSet和Statement资源
        try {
            if (rst != null) rst.close();
            if (stmt != null) stmt.close();
        } catch (SQLException closeEx) {
            closeEx.printStackTrace();
        }
    }
    return e;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:24:03