resultset,如何获取ResultSet的行数和列数

时间:2023-09-02 10:13:38编辑:coo君

1,如何获取ResultSet的行数和列数

当我们执行数据库查询返回一个ResultSet的时候,很多情况下我们需要知道这个ResultSet的大小,即它的行数和列数。我们知道它的列数可以通过resultSet.getMetaData().getColumnCount()很容易地得到,然而,java API没有提供直接访问ResultSet行数的接口。这个时候,有三个办法可以解决:1.改用select count语句,然后直接从ResultSet里面获取结果:try{Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select count(*) as rowCount from tableName");resultSet.next();introwCount = resultSet.getInt("rowCount");}catch(Exception e) {//TODO: handle exceptione.printStackTrace();}但是,我们执行数据库查询不光要知道结果的行数,往往接下来还要用到查询结果。如果用此方法,还需要再执行一次select语句,才能得到想要的结果集,这样,就多了一次数据库查询,大大降低了执行速度。2.遍历Resultset,用一个变量记录行数。代码如下:intcount = 0;try{while(resultSet.next()){count = count + 1;}}catch(SQLException e1) {//TODO Auto-generated catch blocke1.printStackTrace();}这样获取的count值就是结果集的行数。然而,这种方法同第一种方法的问题一样,不能再使用结果集了。因为这时候指针已经移动到结果集的外面了,不再指向任何记录。3.知道了第二种方法中问题的原因,我们就知道如何更好地解决这个问题了。第二种方法的问题在于返回的结果集中的指针不能自由移动,幸好java为我们提供了选择,可以让我们创建指针可以自由移动的结果集,所需要做的只有一件事,就是在创建Statement的时候,加上两个参数:try{//Statement statement = connection.createStatement();Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet resultSet = statement.executeQuery("select * from " + tableName);}catch(Exception e) {//TODO: handle exceptione.printStackTrace();}这样获得的结果集,指针就可以在其中自由移动。然后,就可以用如下方法获取结果集的行数:introwCount = 0;try{resultSet.last();rowCount = resultSet.getRow();}catch(Exception e) {//TODO: handle exceptione.printStackTrace();}其中resultSet.last()就是将指针移动到结果集的最后一条记录;然后用resultSet.getRow()获取指针当前所在的行号(从1开始)如果接下来你还要使用结果集,别忘了将指针移到第一行:resultSet.first();既然结果集是可滚动的,当然可以用absolute()方法访问指定行号的记录:其中row参数可正可负,具体含义查一下ResultSet的absolute()方法就知道了。

2,如何获取ResultSet的行数和列数(转)

resultSet.next();int rowCount = resultSet.getInt("rowCount"); 方法2:遍历Resultset,用一个变量记录行数:int count = 0;while(resultSet.next()) {count = count + 1;} 方法3:创建Statement的时候,加上两个参数,这样获得的结果集,指针就可以在其中自由移动Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet resultSet = statement.executeQuery("select * from " + tableName);int rowCount = 0;resultSet.last();rowCount = resultSet.getRow();//其中resultSet.last()就是将指针移动到结果集的最后一条记录;然后用resultSet.getRow()获取指针当前所在的行号(从1开始)

3,java中Result和ResultSet的区别,各有什么优点?

二者的区别在于前者对于修改不敏感,而后者对于修改敏感
resultSetConcurency是设置ResultSet对象能够修改的,取值如下:
ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。
ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。

以下两种方法的共性:返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
不可用结果集更新数据库:
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
可用结果集直接更新数据库:
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATETABLE);

4,如何把ResultSet转换成Java对象

有时候我们不想使用任何框架,但又需要用JDBC实现类似于iBATIS的orm映射功能,把一个ResultSet转换成我们的JavaBeans,我们可以模仿iBATIS的方式自己写一个ResultSetMapper实现类,利用反射原理把ResultSet转换成一个JavaBeans,下面是网上的一个开源实现,主要用到的是注解和反射机制,我们先看一下使用效果:
在CODE上查看代码片派生到我的代码片
package com.heaven.mapper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class SampleMain {
public static void main(String ...args){
try {
ResultSetMapper resultSetMapper = new ResultSetMapper();
ResultSet resultSet = null;
// simple JDBC code to run SQL query and populate resultSet - START
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database = "jdbc:odbc:AkDb";
Connection connection = DriverManager.getConnection( database ,"","");
PreparedStatement statement = connection.prepareStatement("SELECT * FROM UsersSample");
resultSet = statement.executeQuery();
/******************************/
List pojoList = resultSetMapper.mapRersultSetToObject(resultSet, SamplePojo.class);
/******************************/
if(pojoList != null){
for(SamplePojo pojo : pojoList){
System.out.println(pojo);
}
}else{
System.out.println("ResultSet is empty. Please check if database table is empty");
}
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
如上图所示,把ResultSet转换成我们的JavaPojo对象只需要调用ResultSetMapper的一个方法即可完成,使用起来非常方便。
下面是ResultSetMapper源代码:
在CODE上查看代码片派生到我的代码片
package com.heaven.mapper;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import org.apache.commons.beanutils.BeanUtils;
public class ResultSetMapper {
@SuppressWarnings("unchecked")
public List mapRersultSetToObject(ResultSet rs, Class outputClass) {
List outputList = null;
try {
// make sure resultset is not null
if (rs != null) {
// check if outputClass has 'Entity' annotation
if (outputClass.isAnnotationPresent(Entity.class)) {
// get the resultset metadata
ResultSetMetaData rsmd = rs.getMetaData();
// get all the attributes of outputClass
Field[] fields = outputClass.getDeclaredFields();
while (rs.next()) {
T bean = (T) outputClass.newInstance();
for (int _iterator = 0; _iterator < rsmd.getColumnCount(); _iterator++) {
// getting the SQL column name
String columnName = rsmd.getColumnName(_iterator + 1);
// reading the value of the SQL column
Object columnValue = rs.getObject(_iterator + 1);
// iterating over outputClass attributes to check if
// any attribute has 'Column' annotation with
// matching 'name' value
for (Field field : fields) {
if (field.isAnnotationPresent(Column.class)) {
Column column = field.getAnnotation(Column.class);
if (column.name().equalsIgnoreCase(columnName) && columnValue != null) {
BeanUtils.setProperty(bean, field.getName(), columnValue);
break;
}
}
}
}
if (outputList == null) {
outputList = new ArrayList();
}
outputList.add(bean);
}
} else {
// throw some error
}
} else {
return null;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return outputList;
}
}
使用注解的pojo对象:
在CODE上查看代码片派生到我的代码片
package com.heaven.mapper;
import javax.persistence.Column;
import javax.persistence.Entity;
@Entity
public class SamplePojo {
@Column(name="User_Id")
private int id;
@Column(name="User_Name")
private String name;
@Column(name="Address")
private String address;
@Column(name="Gender")
private boolean gender;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
@Override
public String toString() {
return "id: " + id + "\n" +
"name: " + name + "\n"+
"address: " + address + "\n" +
"gender: " + (gender ? "Male" : "Female") + "\n\n";
}
}

5,英文翻译成中文什么意思?

156/01019
极转子的两半
塔拉索夫工程股份有限公司(JSC就是股份合作公司的意思,这是俄罗斯最大的汽车-拖拉机电气设备和备件的制造商之一)
443011(相当于我们的邮政代码)萨马拉市
novo-sadovaya(诺娃-萨多瓦娅,这是萨马拉市的一座大楼,也有一条大街叫此名,较可能是xx街311号),311应是房间号或门牌号,俄罗斯
毛重:19320公斤

上一篇:什么轻舟已过万重山

下一篇:商标查询官方网站