ResultSet方法previous()不起作用

N.a*_*N.a 0 java jdbc

   public void actionPerformed(ActionEvent E)
   {
       int id;
       String name,address,phone;
       Connection conn = null;
       PreparedStatement stmt = null;
       try {
           //STEP 2: Register JDBC driver
           Class.forName("com.mysql.jdbc.Driver");

           //STEP 3: Open a connection
           System.out.println("Connecting to database...");
           conn = DriverManager.getConnection(DB_URL,USER,PASS);

           //STEP 4: Execute a query
           String sql;
           sql = "SELECT * FROM person";
           System.out.println("Creating statement...");
           stmt = conn.prepareStatement (sql,ResultSet.TYPE_SCROLL_INSENSITIVE , 
                                     ResultSet.CONCUR_UPDATABLE );


            ResultSet rs = stmt.executeQuery(sql);

            if(E.getSource()== bNext) {
                rs.next();
                id  = rs.getInt("id");
                name = rs.getString("name");
                address = rs.getString("address");
                phone = rs.getString("phone");

                //Display values
                System.out.print("ID: " + id);
                System.out.print(", Name: " + name);
                System.out.print(", Address: " + address);
                System.out.println(", Phone: " + phone);
            }
            if(E.getSource()== bPrevious) {
                rs.previous();
                id  = rs.getInt("id");
                name = rs.getString("name");
                address = rs.getString("address");
                phone = rs.getString("phone");

                //Display values
                System.out.print("ID: " + id);
                System.out.print(", Name: " + name);
                System.out.print(", Address: " + address);
                System.out.println(", Phone: " + phone);
            }
            if(E.getSource()==bLast) {
                rs.last();
                id  = rs.getInt("id");
                name = rs.getString("name");
                address = rs.getString("address");
                phone = rs.getString("phone");

               //Display values
               System.out.print("ID: " + id);
               System.out.print(", Name: " + name);
               System.out.print(", Address: " + address);
               System.out.println(", Phone: " + phone);
           }
           if(E.getSource()==bFirst) {
               rs.first();
               id  = rs.getInt("id");
               name = rs.getString("name");
               address = rs.getString("address");
               phone = rs.getString("phone");

               //Display values
               System.out.print("ID: " + id);
               System.out.print(", Name: " + name);
               System.out.print(", Address: " + address);
               System.out.println(", Phone: " + phone);
          }
          //STEP 6: Clean-up environment
          rs.close();
          stmt.close();
          conn.close();
    }
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但previous()方法不起作用,每当next用户按下按钮时,输出保持不变,并且不会向前移动.有人可以帮忙吗?

Era*_*ran 8

每次actionPerformed调用方法时(我假设在按下某个按钮时调用它),您再次执行查询.因此next()总会给你第一个元素并previous返回false.

您应该将所有行读入某些数据结构,例如ArrayList(作为初始化步骤,而不是单击按钮时),并保持当前索引List,这将允许您在单击按钮时向前或向后移动.

PS你不应该使用rs.next()rs.previous()不检查返回值.如果这些方法返回false,则不应调用诸如的方法rs.getInt("id"),因为它们会抛出异常.

PPS一些JDBC驱动程序不支持previous(),firstlast方法,这意味着他们可能会抛出SQLFeatureNotSupportedException.但是,next()正如我所建议的那样,只有在初始化步骤中读取所有数据时才需要.