将ResultSet结果集通过反射转换成对象LIST集合

时间:2022-06-15 19:08:56

说明:Lz新手,通过这个练习反射。(mysql数据库)

一,简单的创建一个数据库,并给上数据。
将ResultSet结果集通过反射转换成对象LIST集合

二、
1.创建一个Emp.java 。
2.创建和 数据库中各列名一样的属性,且为private类型。
3.有一个空构造器。
4.有get/set 方法,重写toString方法,hashCode和equals方法。

三、写一个测试类。

public class TestUser {
public static void main(String[] args) {
//查询所有信息,输出List集合
queryAllUserInfo();
}

private static void queryAllUserInfo() {
//创建一个List集合,来装emp
List<Emp> list=new ArrayList<>();
//声明链接,在后面获取链接
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
String sql="select * from t_emp";
try {
//通过自己写的工具类获取链接
connection=WyUtil.createConnection();
//获取preparedstatement
preparedStatement=WyUtil.createPreparedStatement(connection, sql);
resultSet=preparedStatement.executeQuery();
//自己写的一个resultToList方法,把resultSet的信息转换为Emp的对象,并将对象装进List集合
list=WyUtil.resultToList(resultSet, Emp.class);

} catch (Exception e) {
e.printStackTrace();
}finally {
//通过工具类关闭所有链接
WyUtil.closeAll(connection, preparedStatement, resultSet);
}
//输出所有对象的信息
System.out.println(list);
}

//resultToList方法
public static <T> List<T> resultToList(ResultSet resultSet, Class<T> clazz) {
//创建一个 T 类型的数组
List<T> list = new ArrayList<>();
try {
//通过反射获取对象的实例
T t = clazz.getConstructor().newInstance();
//获取resultSet 的列的信息
ResultSetMetaData metaData = resultSet.getMetaData();
//遍历resultSet
while (resultSet.next()) {
//遍历每一列
for (int i = 0; i < metaData.getColumnCount(); i++) {
//获取列的名字
String fName = metaData.getColumnLabel(i + 1);
//因为列的名字和我们EMP中的属性名是一样的,所以通过列的名字获得其EMP中属性
Field field = clazz.getDeclaredField(fName.toLowerCase());
//因为属性是私有的,所有获得其对应的set 方法。set+属性名首字母大写+其他小写
String setName = "set" + fName.toUpperCase().substring(0, 1) + fName.substring(1).toLowerCase();
//因为属性的类型和set方法的参数类型一致,所以可以获得set方法
Method setMethod = clazz.getMethod(setName, field.getType());
//执行set方法,把resultSet中的值传入emp中, 再继续循环传值
setMethod.invoke(t, resultSet.getObject(fName));
}
//把赋值后的对象 加入到list集合中
list.add(t);
}

} catch (Exception e) {
e.printStackTrace();
}
// 返回list
return list;
}