通过连接数据库, select 语句会得到 ResultSet . 然后正常情况下 会取出ResultSet 中的值进行各种操作. 操作完成之后 ResultSet 进行close. 再连接close.
现在,我想让返回的 ResultSet 继续存在.不知道有没有什么好的办法. 如果是用C#写的话 他会返回 dataset 而dataset和数据库连接之类的操作本身是不绑定的,所以 关闭连接后不会关闭这个 dataset
但是现在java里关闭Connection, PreparedStatement 这2个对象之后 ResultSet 就默认被关闭了.
现在,我想让返回的 ResultSet 继续存在.不知道有没有什么好的办法. 如果是用C#写的话 他会返回 dataset 而dataset和数据库连接之类的操作本身是不绑定的,所以 关闭连接后不会关闭这个 dataset
但是现在java里关闭Connection, PreparedStatement 这2个对象之后 ResultSet 就默认被关闭了.
JDBC规范里面也有不依赖数据库连接的接口是RowSet极其子接口,这个用的比较少,RowSet的子接口具体实现相对麻烦一些
我需要的是 ResultSet 断开之后我依然能够 getInt("列");因为我不关心 db 访问层操作. 仅仅需要一个类似ResultSet结构的对象被返回回来就行.比如:
//我在任何想执行select的地方都只需要掉这个方法获得ResultSet 但是ResultSet会被db访问层给关闭,所以我需要一个替代品. 而替代品肯定不能是Arraylist这样简单结构的东西
public ResultSet getResult(String sql, String dbName);
package jdbc.basic;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;import javax.sql.rowset.CachedRowSet;import com.sun.rowset.CachedRowSetImpl;/**
* 这个例子用来学习JDBC规范当中的行集RowSet
* 只能能够证明,如果连接关闭了,仍然可以通过RowSet获取到之前存储的数据
* @author GaoYong
*
*/
public class CustomerCon {
public static Connection con=null;
public static Statement stmt=null;
public static ResultSet rs=null;
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/TEST?useUnicode=true&characterEncoding=UTF-8";
Class.forName(driver);
con=DriverManager.getConnection(url,"root","root");
stmt=con.createStatement();
String sql="select * from customer";
rs=stmt.executeQuery(sql);
System.out.println("-------如下利用ResultSet输出------");
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
int age=rs.getInt("age");
System.out.println(id+","+name+","+age);
}
System.out.println("------ResultSet输出结束-----------");
CachedRowSet rowset=new CachedRowSetImpl();
//利用rs的数据填充到rowset并将游标调整到初始状态
rowset.populate(rs,1);
rs.close();
stmt.close();
con.close();
System.out.println("-------如下利用RowSet输出------");
while(rowset.next()){
int id=rowset.getInt("id");
String name=rowset.getString("name");
int age=rowset.getInt("age");
System.out.println(id+","+name+","+age);
}
System.out.println("------RowSet输出结束-----------");
rowset.close();
}}
ResultSetMetaData rsm = your_resultset.getMetaData();
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
while (your_resultset.next());
Map<String, Object> map = new TreeMap<String, Object>();
for (int i=0; i<rsm.getColumnCount(); i++) {
map.put(rsm.getColumnName(i), rs.getObject(i));
}
result.add(map);
}
来访问ResultSet中查出的元素了
-------------------谢谢,这个就够了. 其他缓存方法,都是自实现的 , 没有系统提供的直接.还是谢谢了.