package day06;
/*
crud 增删改查

*/

import day05.jdbc.MysqlUtil;
import day05.jdbc.TbUser;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DaoDemo01 {
public static void main(String[] args) throws Exception {
String sql ="select * from auth_group";
List<TbUser> tbUsers = testDao(sql, null, TbUser.class);
System.out.println(tbUsers);

}

public static List<TbUser> queryAll() throws Exception {
Connection conn = MysqlUtil.getConn();
String sql = "select * from auth_permission";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
List<TbUser> list = new ArrayList<>();
while (resultSet.next()) {
long id = resultSet.getLong(1);
String name = resultSet.getString(2);
TbUser tbUser= new TbUser(id,name);
list.add(tbUser);
}
MysqlUtil.close(conn);
return list;

}
public static <T> List<T> testDao(String sql,List<Object> params,Class<T> cls) throws Exception {
// 静态方法的泛型
// 传参,sql和sql里面的变量
//Class<T> cls,拿到一个类的Class,通过反射然后构建对象
//拿到对象的属性字段,然后给属性设置值

//1、建立连接
Connection conn = MysqlUtil.getConn();
//2、预编译
PreparedStatement ps = conn.prepareStatement(sql);
// 3、运行sql,得到结果集
ResultSet rs = ps.executeQuery();
// 集合
List<T> list =new ArrayList<>();
while (rs.next()){
// 反射,创建一个类的实例
T t = cls.newInstance();
// 得到这个类所有的属性/字段
Field[] fields = cls.getDeclaredFields();
// 通过循环,给属性/字段设置值
for (Field field:fields){
String fieldName =field.getName();//属性/字段的名称
field.setAccessible(true);//设置字段可访问的权限
//在结果集中,通过列名fileName,来或者对应的值
// 我们不知道具体是什么类,所以我们用Object
Object object = rs.getObject(fieldName);

//给对象的当前属性设置值
//这里涉及到3个数据,field.set(t,object),里面第一个参数传的是实例,
// 第二个参数是给当前的属性设置的值
// 当前是什么属性?我们就在遍历for (Field field:fields)属性的循环里,取的当前的属性
field.set(t,object);

}
// 给存放结果集的集合,添加对象
list.add(t);

}
MysqlUtil.close(conn);//关闭数据库连接
return list;
}
}