我们打算拿到数据库中某一数据表中的内容,但我们并不知道该数据表的列名和行数时怎么办?
使用元数据,获取数据表的行数(实例数)、列数(属性的个数)、列名(属性名)
我们拿到数据表中的内容,并根据每一行的内容创建一个对象,但我们并不知道需要什么类型的对象。
1、使用泛型 2、使用反射创建对象,因为需要在运行中获取泛型的具体类型,然后创建此类型的对象
没有创建对应的实体类时该怎么办?
使用匿名内部类,或,每一个属性:值作为Map的元素存储,有多少值Map中就有多少元素,再用List存储Map
其中getConnection()和closeResource()方法时提供好的获取数据库链接和关闭资源的方法,无关紧要,不做展示。
具体实现详见代码及注释,注释详见上一篇博客
public class GetCollection {
public static <T> List<T> method(Class<T> clazz) throws Exception {
List<T> list = new ArrayList<>();
//定义sql取别名,则匿名内部类中的成员变量名需要和别名一致
String sql = "SELECT did,AVG(salary) avg,MAX(salary) max FROM t_employee GROUP BY did;";
Connection connection = GetConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
while (resultSet.next()) {
T t = clazz.newInstance();
for (int i = 1; i <= count; i++) {
Object object = resultSet.getObject(i);
String columnLabel = metaData.getColumnLabel(i);
Field declaredField = clazz.getDeclaredField(columnLabel);
declaredField.set(t, object);
}
list.add(t);
}
return list;
}
}
class Demo {
public static void main(String[] args) throws Exception {
List method = GetCollection.method(new Object() {
int did;
double avg;
double max;
@Override
public String toString() {
return "$classname{" +
"did=" + did +
", avg=" + avg +
", max=" + max +
'}';
}
}.getClass());
method.forEach(System.out::println);
}
}
输出结果:
$classname{did=1, avg=19945.471538461537, max=130990.0}
$classname{did=2, avg=11708.5, max=18978.0}
$classname{did=3, avg=70223.0, max=130990.0}
$classname{did=4, avg=12332.0, max=16788.0}
$classname{did=5, avg=11065.5, max=15099.0}