一般做法是将ResultSet封装成一个个javabean然后将javabean放入list集合中返回。
类似于:
public class test {
DB dbx = new DB();
public static List resultSetToList(String sql) throws SQLException {
DB dbx = new DB();
ResultSet rs = dbx.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
for (int i = 0; i < md.getColumnCount(); i++) {
System.out.println(md.getColumnName(i));
System.out.println( "----------------- ");
}
List list = new ArrayList();
while (rs.next()) {
UserBean bean = new UserBean();
int userid = rs.getInt( "userid ");
String username = rs.getString( "username ");
bean.setUserid(userid + " ");
bean.setUsername(username);
list.add(bean);
System.out.println(userid + " "+username);
}
return list;
}
}
另外一种方法
package com.service;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import com.entity.Student;
public class Service {
public List toList(ResultSet rs,Class cls)
{
try
{
List lst=new ArrayList();
//用于获取列数、或者列类型
ResultSetMetaData meta=rs.getMetaData();
Object obj=null;
while(rs.next())
{
//获取formbean实例对象
obj=Class.forName(cls.getName()).newInstance(); //用Class.forName方法实例化对象和new创建实例化对象是有很大区别的,它要求JVM首先从类加载器中查找类,然后再实例化,并且能执行类中的静态方法。而new仅仅是新建一个对象实例
//循环获取指定行的每一列的信息
for(int i=1;i<=meta.getColumnCount();i++)
{
//当前列名
String colName=meta.getColumnName(i);
//将列名第一个字母大写(为什么加+""ne ?是大写字母比小写字母多个字节?)
colName=colName.replace(colName.charAt(0)+"", new String(colName.charAt(0)+"").toUpperCase());
//设置方法名
String methodName="set"+colName;
System.out.println(methodName);
//获取当前位置的值,返回Object类型
Object value=rs.getObject(i);
//利用反射获取对象(反射概念很模糊?不太懂)
Method method=obj.getClass().getMethod(methodName, value.getClass());
method.invoke(obj, value); //感觉这段类似于obj.setMethodName(value)......对于静态方法的反射可以写成method.invoke(null,value),而不能把第一个参数省略,如果方法没有参数的话,第二个参数可以为空
}
lst.add(obj);
}
return lst;
}
catch(Exception ex)
{
ex.printStackTrace();
return null;
}
}
}