rs.last()在java中的用法
时间: 2024-03-05 16:48:57 浏览: 109
`rs.last()` 是 Java JDBC API 中的一个方法,用于将结果集的游标移动到结果集的最后一行,然后返回 true。如果结果集中没有数据,则返回 false。
该方法的语法如下:
```java
public boolean last() throws SQLException
```
示例用法:
```java
ResultSet rs = statement.executeQuery("SELECT * FROM my_table");
if (rs.last()) {
// 获取最后一行数据的列值
int id = rs.getInt("id");
String name = rs.getString("name");
// ... 其他列值的获取
}
```
需要注意的是,`last()` 方法可能会导致性能问题,特别是对于大型结果集。因为它需要将结果集中的所有数据都读取到内存中,然后才能确定最后一行。如果只需要获取结果集中的行数,可以使用 `SELECT COUNT(*)` 查询语句来替代。
相关问题
package project; import java.sql.*; public class useOpea { public int query(String sql,Object[] objects) throws SQLException { int n=0; Connection conn=DriverManager.getConnection("jdbc:mysql://192.168.24.224:3306/dorm","root","123456"); PreparedStatement pstm=conn.prepareStatement(sql,1004,1007); if(objects!=null && objects.length>0){ for(int i=0;i<objects.length;i++ ) { pstm.setObject(i+1,objects[i]); } } ResultSet rs=pstm.executeQuery(); rs.last(); n=rs.getRow(); rs.close(); pstm.close(); conn.close(); return n; } public Object[][] queryToArray(String sql,Object[]pars) throws SQLException{ Connection conn=DriverManager.getConnection("jdbc:mysql://192.168.24.224:3306/dorm","root","123456"); PreparedStatement pstm=conn.prepareStatement(sql,1004,1007); if(pars!=null && pars.length>0){ for(int i=0;i<pars.length;i++ ) { pstm.setObject(i+1,pars[i]); } } ResultSet rs=pstm.executeQuery(); rs.last(); int n=rs.getRow(); ResultSetMetaData resultSetMetaData=rs.getMetaData(); int m=resultSetMetaData.getColumnCount(); Object[][]data=new Object[n][m]; rs.beforeFirst(); int i=0; while(rs.next()) { for(int j=0;j<m;j++) { data[i][j]=rs.getObject(j+1); i++; } } return data; } public static void main(String[]args) throws SQLException { useOpea userOpertion = new useOpea(); Object[][] data= userOpertion.queryToArray("select * from student", args); for(int i=0;i<data.length;i++) { for(int j=0;j<data[i].length;j++) { System.out.println(data[i][j]+" "); } } } }有什么错误
这段程序有一些潜在的问题,具体如下:
1. 在queryToArray方法中,如果查询结果集为空,即ResultSet.getRow()返回0,那么应该直接返回null,否则在后面的代码中会出现数组下标越界异常。
2. 在queryToArray方法中,内部循环的索引i应该累加在内层循环的末尾,否则会导致数据填充不完整。
3. 在main方法中,调用queryToArray方法时传入的参数args应该为null,否则会导致SQL语句解析错误。
4. 在main方法中,输出结果时应该使用print而不是println,否则会导致每个元素都换行输出。
综上所述,以下是修改后的程序代码:
```java
package project;
import java.sql.*;
public class useOpea {
public int query(String sql, Object[] objects) throws SQLException {
int n = 0;
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.24.224:3306/dorm", "root", "123456");
PreparedStatement pstm = conn.prepareStatement(sql, 1004, 1007);
if (objects != null && objects.length > 0) {
for (int i = 0; i < objects.length; i++) {
pstm.setObject(i + 1, objects[i]);
}
}
ResultSet rs = pstm.executeQuery();
rs.last();
n = rs.getRow();
rs.close();
pstm.close();
conn.close();
return n;
}
public Object[][] queryToArray(String sql, Object[] pars) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.24.224:3306/dorm", "root", "123456");
PreparedStatement pstm = conn.prepareStatement(sql, 1004, 1007);
if (pars != null && pars.length > 0) {
for (int i = 0; i < pars.length; i++) {
pstm.setObject(i + 1, pars[i]);
}
}
ResultSet rs = pstm.executeQuery();
rs.last();
int n = rs.getRow();
if (n == 0) {
return null;
}
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int m = resultSetMetaData.getColumnCount();
Object[][] data = new Object[n][m];
rs.beforeFirst();
int i = 0;
while (rs.next()) {
for (int j = 0; j < m; j++) {
data[i][j] = rs.getObject(j + 1);
}
i++;
}
return data;
}
public static void main(String[] args) throws SQLException {
useOpea userOpertion = new useOpea();
Object[][] data = userOpertion.queryToArray("select * from student", null);
if (data != null) {
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.print(data[i][j] + " ");
}
System.out.println();
}
}
}
}
```
21:08:05 RandomGetRecord. java↵ import java. sql.*;↵ import java. util.*;↵ public class RandomGetRecord {↵ public static void main(String args[]){↵ int wantRecordAmount=10;随机抽取的记录数目↵ Random random=new Random();↵ try{ 【代码1】//加载JDBC-ODBC桥接器↵ }< catch(ClassNotFoundException e){↵ System. out. print(e);↵ }. Connection con;↵ Statement sql;↵ ResultSe t rs;↵ 21:09:00 try{ String uri="jdbc:odbc:dataSource";↵ String id="";↵ String password=””;↵ con=DriverManager. getConnection(uri, id, password);↵ sql= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,↵ ResultSet.CONCUR_READ_ONLY);↵ rs=【代码2】//sql调用. executeQuery方法查询goods表中的全部记录↵ rs. last(); /将rs的游标移到rs的最后一行↵ _ int count=rs. getRow(); Vector<Integer>vector=new Vector<Integer>0;↵ for(int i=1;i<=count;i++) { ↵ vector. add(new Integer(i));↵ } ↵ int itemAmount=Math . min(wantRecordAmount, count);↵ System. out. println("随机抽取"+itemAmount+"条记录.");↵ double sum =0,n=itemAmount;↵ while(itemAmount>0){↵ int randomIndex =random. nextInt(vector. size());↵ int index=(vector. elementAt(randomIndex)). intValue();↵ 【代码3】//将rs的游标游标移到index↵ String number =rs. getString(1);↵ String name=rs. getString(2);↵ java. util. Date date=rs. getDate(3);↵ double price=rs. getDouble(4);↵ sum=sum+price;↵ itemAmount--; vector. removeElementAt(randomIndex);↵ } con. close();↵ double aver=sum/n;↵ System. out. println("均价:"+aver+"元");↵ } catch(SQLException e){↵ 21:10:55 System.out.println(“”+e);
这段代码是一个 Java 程序,用于从一个名为 "goods" 的表中随机抽取指定数量的记录,并计算它们的均价。其中,"wantRecordAmount" 变量表示要抽取的记录数目,"uri"、"id" 和 "password" 变量表示连接数据库所需的信息,"rs" 表示查询结果集。代码中的 【代码1】、【代码2】和【代码3】分别表示需要填写的代码部分。程序首先加载 JDBC-ODBC 桥接器,然后建立数据库连接,使用 executeQuery 方法查询 "goods" 表中的全部记录并将游标移到最后一行,接着将所有记录的行号存入一个 vector 中,然后从中随机抽取指定数量的记录,并计算它们的均价。如果在这个过程中发生 SQL 异常,则程序将输出异常信息。
阅读全文