【问题标题】:Select * From java with preparedStatement [duplicate]使用preparedStatement从java中选择* [重复]
【发布时间】:2021-10-21 23:05:38
【问题描述】:

我今天在选择 SQL 时遇到了这个问题。此方法应该在 tex tfields 中显示数据库中的数据。我将它从语句更改为preparedStatement,但遇到了问题。

 public Entreprise loadDataModify(String id) { 
    Entreprise e = new Entreprise();
    PreparedStatement stmt;

    try {
        String sql = "SELECT * FROM user WHERE mail=?";
        stmt = cnx.prepareStatement(sql);
        stmt.setString(1, id);
        

        ResultSet rst = stmt.executeQuery(sql);
        while (rst.next()) {
            stmt.setString(2, e.getNom());
            stmt.setString(3, e.getEmail());
            stmt.setString(4, e.getTel());
            stmt.setString(5, e.getOffre());

        }

    } catch (SQLException ex) {
        System.out.println(ex.getMessage());

    }
    return e;

}

这表明我的语法有问题,输出是“nu”

【问题讨论】:

标签: java sql jdbc prepared-statement


【解决方案1】:

您对executeQuery() 的调用应该传递查询字符串。使用这个版本:

String sql = "SELECT * FROM user WHERE mail=?";
stmt = cnx.prepareStatement(sql);
stmt.setString(1, id);

ResultSet rst = stmt.executeQuery();
while (rst.next()) {
    // process result set
}

您当前的代码实际上正在调用一些重载的Statement#executeQuery() 方法,这不是您要调用的方法的版本。

【讨论】:

    【解决方案2】:

    您没有填写您的 Enterprise 对象。而且您没有正确使用executeQuery() 功能。如下所示,括号内的参数已被删除。 PreparedStatements 首先需要参数的值(查询中的?),然后必须执行形成的查询。如果您将String 参数传递给executeQuery(),则将执行括号中的查询。

    Enterprise 被填充的部分如下所示。

    这是正确的方法:

    public Entreprise loadDataModify(String id) { 
        Entreprise e = new Entreprise();
        PreparedStatement stmt;
    
        try {
            String sql = "SELECT * FROM user WHERE mail=?";
            stmt = cnx.prepareStatement(sql);
            stmt.setString(1, id);
            
    
            ResultSet rst = stmt.executeQuery();
            while (rst.next()) 
            {
                // rst keeps the data, so you have to traverse it and get the data from it in this way.
                e.setNom( rst.getString("HERE EITHER THE COLUMN NAME OR INDEX"));
                e.setEmail( rst.getString("HERE EITHER THE COLUMN NAME OR INDEX"));
                e.setTel( rst.getString("HERE EITHER THE COLUMN NAME OR INDEX"));
                e.setOffre( rst.getString("HERE EITHER THE COLUMN NAME OR INDEX"));
    
            }
    
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
    
        }
        return e;
    
    }
    

    【讨论】:

    • 你的代码是正确的,但是你没有解释OP的问题。
    【解决方案3】:

    你调用了错误的方法。与 Statement 不同,当您使用 PreperedStatement 时,您应该首先设置参数的值,然后可以调用该实例的 executeQuery() 方法。 此外,最好使用 try-with-resources,因为 Statement 或 PreparedStament 对象是 Resource(资源是实现 AutoCloseable 接口),你必须关闭它。使用 try-with-resources,它会自动完成。 ResultSet 实例也是一个资源,但是当语句对象关闭时它就关闭了,因此您不必显式关闭它。 因此,解决您的问题的最佳方法是:

     String selectAllByMail = "SELECT * FROM user WHERE mail=?";
        try (PreparedStatement prpStatement = connection.prepareStatement(selectAllByMail)) {
            // use prpStatement
            prpStatement.setString(1, id);
            ResultSet resultSet = prpStatement.executeQuery();
            while (resultSet.next()) {
                // process resultSet
    
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多