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
相关产品推荐
相关产品推荐

