适合不同表的查询,且可以显示多条查询结果
//不同表的多条结果
public <T> List<T> QueryLast(Class<T> clazz, String sql, Object...args){
Connection conn = null;
PreparedStatement pre = null;
ResultSet re = null;
try {
conn = JDBCUtils.getConnection();//这里的JDBCUtils是额外创建的类,封装了连接和关闭数据库的方法
pre = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
pre.setObject(i+1,args[i]);
}
re = pre.executeQuery();
//获取结果集的元数据
ResultSetMetaData me = re.getMetaData();
//通过resultsetmetadata获取结果集中的列数
int co = me.getColumnCount();
ArrayList<T> list = new ArrayList<>();
while (re.next()){
T t = clazz.getDeclaredConstructor().newInstance();
for (int i = 0; i < co; i++) {
//获取列值
Object columValue = re.getObject(i + 1);
//获取每个列的列名
//getColumnname不常用
//getColumnLabel可以获取别名,当数据库表不一致时,在语句中设置别名更方便
String columnName = me.getColumnLabel(i + 1);
//给p对象指定的columnname属性,赋值为columnvalue,通过反射
Field field = student.class.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.closeResource(conn,pre,re);
}
return null;
}
@Test
public void Test2(){
String sql="select name,birthday date,id from student";
List<student> students = QueryLast(student.class, sql);
students.forEach(System.out::println);
}