有 Java 编程相关的问题?

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

结果集开始之前的java MySQL

我试图从一个表中获取personID,并在第二个表中使用它,然后从中打印每列值 但是,第二个表显示了错误column index out of range, 3 < 1。订单表由3列组成

public void getPersonsOrders(String firstName){
    Connection con = connect();                                                                                             
    try{
        Statement s = con.createStatement();
        s.executeUpdate("use stl;");
        ResultSet rs1 = s.executeQuery("select personID from person where first_name = " +"'"+firstName+"'"+";");       //get persons ID no.
        rs1.next();
        ResultSet rs2 = s.executeQuery("select * from orderr where personID = "+rs1.getInt(3)+";");             //use ID no. to           
        for(int i = 1; i < 4; i++){                                                                             //retrive order
            System.out.println(rs2.getInt(i));
        }
    }
    catch(SQLException e){
        System.out.println("3" +e.getMessage());
    }
}

共 (3) 个答案

  1. # 1 楼答案

    为了帮助编写更好的代码,我想提到几个问题:

    1:如果firstName包含一个单引号,sql语句将失败(firstrName中有一个单引号,它本身就是单引号)。您需要将firstName中出现的任何单引号转换为两个单引号,或者使用preparedStatements
    2:最好使用getInt(“personID”)等术语,而不是getInt(1),这样更容易阅读
    3:我们通常使用if(rs1.next()){}(期望一个结果)或while(rs1.next()){}(期望多个结果)代替rs1。下一步()
    4:我们通常按与try/catch/finally块的finally块声明相反的顺序关闭连接、preparedStatement和resultSet(在关闭它们之前检查它们是否为null)

  2. # 2 楼答案

    rs1中只返回一列,因此应该使用rs1.getInt(1)

    另一方面,这应该可以通过连接轻松解决:

    SELECT o.* FROM order o
    LEFT JOIN person p
    ON p.personID = o.personID
    
  3. # 3 楼答案

    ResultSet rs1 = s.executeQuery("select personID from person where first_name = "+"'"+firstName+"'"+";"); 
    

    上面的代码将生成一个只包含一列的结果。使用此选项可以避免错误

    ResultSet rs2 = s.executeQuery("select * from orderr where personID = "+rs1.getInt(3)+";");            //use ID no. to           
    for(int i = 1; i <= 1; i++){ //retrive order
         System.out.println(rs2.getInt(i));
     }