如何在 JDBC 中从后往前检索 ResultSet 的内容?

jdbcjava 8object oriented programmingprogramming

ResultSet 对象

某些 SQL 查询(尤其是 SELECT)会返回表格数据。在 JDBC 中,java.sql.ResultSet 接口的对象保存由执行查询数据库语句的方法(通常是 Statement 接口的 executeQuery() 方法)返回的表格数据。

ResultSet 游标/指针

ResultSet 对象具有指向当前行的游标/指针。最初,此游标位于第一行之前。

结果集有两种类型:仅向前和双向。默认情况下,我们通过 executeQuery()  方法获取的 ResultSet 是仅向前的类型。使用这种类型,您可以仅向前遍历/移动游标。

双向 ResultSet

双向 ResultSet 对象是指游标可以向前和向后移动的对象。 Connection 接口的 createStatement() 方法有一个变体,它接受两个整数值,分别表示结果集类型和并发类型。

Statement createStatement(int resultSetType, int resultSetConcurrency)

要创建双向结果集,您需要将结果集类型(ResultSet.TYPE_SCROLL_SENSITIVE 或 ResultSet.TYPE_SCROLL_INSENSITIVE)以及并发类型(−)传递给此方法。

//创建 Statement 对象
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

然后,如果您使用此语句调用 executeQuery() 方法,它将返回一个双向的 ResultSet 对象。

从最后一行开始打印内容

ResultSet 接口的 previous()  方法将此 ResultSet 对象的指针从当前位置移动到上一行。

此方法返回一个布尔值,指定 ResultSet 对象是否包含更多行。

如果当前位置之前没有行,则此方法返回 false,否则返回 true。

ResultSet 接口的 Getter 方法(getInt()、getString() 等)接受列索引并返回当前行中指定列的值。

使用这些方法,您可以从头到尾检索 ResultSet 对象的内容。

while(rs.previous()) {
   System.out.print("Brand: "+rs.getString("Mobile_Brand")+", ");
   System.out.print("Sale: "+rs.getString("Unit_Sale"));
   System.out.println("");
}

让我们使用 CREATE 语句在 MySQL 数据库中创建一个名为 mobile_sales  的表,如下所示 −

CREATE TABLE mobile_sales (
   mobile_brand VARCHAR(255),
   unit_sale INT
);

现在,我们将使用 INSERT 语句向 mobile_sales  表中插入 11 条记录 −

insert into mobile_sales values('Iphone', 3000);
insert into mobile_sales values('Samsung', 4000);
insert into mobile_sales values('Nokia', 5000);
insert into mobile_sales values('Vivo', 1500);
insert into mobile_sales values('Oppo', 900);
insert into mobile_sales values('MI', 6400);
insert into mobile_sales values('MotoG', 4360);
insert into mobile_sales values('Lenovo', 4100);
insert into mobile_sales values('RedMI', 4000);
insert into mobile_sales values('MotoG', 4360);
insert into mobile_sales values('OnePlus', 6334);

以下示例与数据库建立连接并从后到前检索表 mobile_sales  的内容。

示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class BidirectionalResultSet {
   public static void main(String args[]) throws Exception {
      //注册驱动程序
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      //获取连接
      String mysqlUrl = "jdbc:mysql://localhost/TestDB";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("连接已建立......");
      //创建 Statement 对象
      Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
      //检索数据
      ResultSet rs = stmt.executeQuery("select * from mobile_sales");
      //将光标移动到 ResultSet 的末尾
      rs.afterLast();
      System.out.println("Contents of the table");
      while(rs.previous()) {
         System.out.print("Brand: "+rs.getString("Mobile_Brand")+", ");
         System.out.print("Sale: "+rs.getString("Unit_Sale"));
         System.out.println("");
      }
   }
}

输出

连接已建立......
Contents of the table
Brand: Vivo, Sale: 1500
Brand: Nokia, Sale: 5000
Brand: Samsung, Sale: 4000
Brand: IPhone, Sale: 3000

相关文章