如何在 JDBC 中从后往前检索 ResultSet 的内容?
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