有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带preparedStatement的java sql Select*

我今天用select SQL遇到了这个问题。这种方法应该以tex-tfields的形式显示数据库中的数据。我把它从一份声明改为一份准备好的声明,但我遇到了一个问题

 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”


共 (3) 个答案

  1. # 1 楼答案

    您没有填充Enterprise对象。而且您没有正确使用executeQuery()函数。如下图所示,括号内的参数已被删除PreparedStatement首先需要参数的值(查询中的?),然后必须执行形成的查询。如果给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;
    
    }
    
  2. # 2 楼答案

    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()方法,该方法不是您要调用的方法的版本

  3. # 3 楼答案

    你调用了错误的方法。与语句不同,在使用PrePrePreedStatement时,应该首先设置参数的值,然后可以调用该实例的executeQuery()方法。 另外,最好使用try with resources,因为语句或PreparedStatement对象是资源(资源是实现自动关闭接口的类),您必须关闭它。使用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();
        }