我们打算拿到数据库中某一数据表中的内容,但我们并不知道该数据表的列名和行数时怎么办?
使用元数据,获取数据表的行数(实例数)、列数(属性的个数)、列名(属性名)
我们拿到数据表中的内容,并根据每一行的内容创建一个对象,但我们并不知道需要什么类型的对象。
1、使用泛型
2、使用反射创建对象,因为需要在运行中获取泛型的具体类型,然后创建此类型的对象
其中getConnection()和closeResource()方法时提供好的获取数据库链接和关闭资源的方法,无关紧要,不做展示。
具体实现详见代码及注释
public class GetCollection {
//创建一个泛型方法,返回泛型List
public static <T> List<T> method(Class<T> clazz) throws Exception {
List<T> list = new ArrayList<>();
//1、获取链接
Connection connection = GetConnection.getConnection();
//2、执行sql查询语句,并根据调用方法时传递的表名(表名与类名相同)动态构造sql语句
String sql = "select * from " + clazz.getSimpleName() + ";";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
//3、获取元数据集对象
ResultSetMetaData metaData = preparedStatement.getMetaData();
//4、获取数据表的列数(属性个数)
int count = metaData.getColumnCount();
//5、遍历结果集
while (resultSet.next()) {
//6、每遍历到一行(也就是一个实例),通过反射创建一个泛型对象
T t = clazz.newInstance();
//7、循环得到这一行的每个属性的值
for (int i = 1; i <= count; i++) {
//8、得到属性的名字
String columnLabel = metaData.getColumnLabel(i);
//9、通过属性的名字得到其值,也可以直接按序号i得到
Object j = resultSet.getObject(columnLabel);
//10、使用属性名通过反射得到该类的属性对象,并设置非public的属性可见
Field declaredField = clazz.getDeclaredField(columnLabel);
declaredField.setAccessible(true);
//11、设置该对象的属性的值
declaredField.set(t, j);
}
//12、向list中添加刚才创建好的对象
list.add(t);
}
CloseResource.closeResource(connection, resultSet, preparedStatement);
return list;
}
}
class demo {
public static void main(String[] args) throws Exception {
List<acccount> usersList = GetCollection.method(acccount.class);
//List<users> usersList = GetCollection.method(users.class); 获取users表中的数据
usersList.forEach(System.out::println);
}
}
public class acccount {
String name;
int id;
int balance;
public acccount() {
}
@Override
public String toString() {
return "acccount{" +
"name='" + name + '\'' +
", id=" + id +
", balance=" + balance +
'}';
}
public acccount(String name, int id, int balance) {
this.name = name;
this.id = id;
this.balance = balance;
}
}
public class users {
int id;
String sname;
String pwd;
@Override
public String toString() {
return "users{" +
"id=" + id +
", sname='" + sname + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public users() {
}
public users(int id, String sname, String pwd) {
this.id = id;
this.sname = sname;
this.pwd = pwd;
}
}
输出结果
acccount{name=‘李白’, id=1, balance=1000}
acccount{name=‘杜甫’, id=2, balance=2500}