如何在JDBC中从后往前读取ResultSet的内容?


ResultSet 对象

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

ResultSet 游标/指针

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

ResultSet 有两种类型:只向前和双向。默认情况下,通过**executeQuery()**方法获得的ResultSet类型为只向前。使用此类型,您只能向前移动游标。

双向ResultSet

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

Statement createStatement(int resultSetType, int resultSetConcurrency)

要创建双向结果集,您需要将类型设置为ResultSet.TYPE_SCROLL_SENSITIVEResultSet.TYPE_SCROLL_INSENSITIVE,以及并发性,传递给此方法。

//Creating a Statement object
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 {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      //Getting the connection
      String mysqlUrl = "jdbc:mysql://127.0.0.1/TestDB";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Creating a Statement object
      Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
      //Retrieving the data
      ResultSet rs = stmt.executeQuery("select * from mobile_sales");
      //Moving the cursor to the end of the 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("");
      }
   }
}

输出

Connection established......
Contents of the table
Brand: Vivo, Sale: 1500
Brand: Nokia, Sale: 5000
Brand: Samsung, Sale: 4000
Brand: IPhone, Sale: 3000

更新于:2019-07-30

569 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告