62,620
社区成员
发帖
与我相关
我的任务
分享 public static ResultSet selectData(String sql){
ResultSet rs = null;
Statement st = null;
Connection conn = ConnectionPool.getConnection();
try {
st = conn.createStatement();
rs = st.executeQuery(sql);
return rs;
} catch (SQLException e) {
e.printStackTrace();
}finally{
try{
if(st!=null){
st.close();
ConnectionPool.closeConnection(conn);
}
}catch(SQLException e){
e.printStackTrace();
}
}
return rs;
}楼主自己已经找到原因了,你把Statement对象关闭了,那么他所有的ResultSet也会被关闭
那怎么办,我还想做个通用的查询数据库的方法给其它地方用呢,难道我在其它地方调用方法后再关闭rs? [quote=引用 2 楼 suciver 的回复:] 楼主自己已经找到原因了,你把Statement对象关闭了,那么他所有的ResultSet也会被关闭
看你写的这个意思是不是不想要总复制粘贴这一套东西? 因为rs必须在关闭之前把里面携带的值copy出去。 你可以试试把一个model类的class传进去,然后用反射,将rs查出来的字段匹配model里面的属性名称将rs查出来的每条记录变成传入的class参数的一个对象,然后返回这类对象的集合。 就像hibernate的HibernateTemplate里面的查询方法一样。
那怎么办,我还想做个通用的查询数据库的方法给其它地方用呢,难道我在其它地方调用方法后再关闭rs? 楼主自己已经找到原因了,你把Statement对象关闭了,那么他所有的ResultSet也会被关闭
public static <T> List<T> selectData(
String sql,
Class<T> clz, //你的实体Bean类
HashMap<String, String> columnsToFieldsMap //数据库表列名到bean字段名的映射
){
ResultSet rs = null;
Statement st = null;
Connection conn = ConnectionPool.getConnection();
List<T> results = new ArrayList<T>();
try {
st = conn.createStatement();
rs = st.executeQuery(sql);
BeanInfo beanInfo = Introspector.getBeanInfo(clz);
PropertyDescriptor[] beanDesArr = beanInfo.getPropertyDescriptors();
ResultSetMetaData rsm = rs.getMetaData();
int size = rsm.getColumnCount();
while(rs.next()){
T obj = clz.newInstance();
for(int i = 1; i <= size; i++ ){
String columnName = rsm.getColumnName(i);
for(PropertyDescriptor prop: beanDesArr){
if(prop.getName().equals(columnsToFieldsMap.get(columnName))){
prop.getWriteMethod().invoke(obj, rs.getObject(i));
}
}
}
results.add(obj);
}
return results;
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
if(st!=null){
st.close();
ConnectionPool.closeConnection(conn);
}
}catch(SQLException e){
e.printStackTrace();
}
}
return results;
}