数据库
数据库中有这样一张表t_emps员工信息表
POJO(普通java类)
首先定义了一个普通java类Emp,根据上表字段在类中定义了以下字段,以及全参和无参构造。
private String id;
private String name;
private String sex;
private Date birth;
private double salary;
private int deptId;
public Emp(String id, String name, String sex, Date birth, double salary, int deptId) {
this.id = id;
this.name = name;
this.sex = sex;
this.birth = birth;
this.salary = salary;
this.deptId = deptId;
}
public Emp() {
}
项目结构
项目结构分为三层,控制层调用服务层,服务层调用执行层:
经过三层简单调用到执行层后,执行层将使用JDBC工具类和数据库通信。
工具类中list方法调用形式如下,形参为一个String类的sql语句,一个Emp的class对象。其将返回一个List集合。
JdbcUntil.list("select * from t_emps", Emp.class)
JdbcUntil.list代码如下
public class JdbcUntil {
public static <T> List<T> list(String sql,Class<T> c){
// 创建一个集合,存放所有对象
List<T> tList = new ArrayList<>();
try{
// 1.注册驱动-反射去加载jar包中com.mysql.jdbc.Drvier类的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf-8", "root", "1234");
// 4.需要创建statement执行sql
Statement statement = con.createStatement();
// 5.statement执行sql,返回结果集
ResultSet rs=statement.executeQuery(sql);
// 结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
// 获取结果集的总列数
int columnCount = md.getColumnCount();
// 6.解析rs
while (rs.next()){//光标向下移动一行,光标默认在列名那一行
// 根据每一行数据,封装成一个实体对象
T t=c.newInstance();
// 1.取出某一行的每个数据,封装到对象t的属性中
for (int i = 1; i < columnCount+1; i++) {
// 通过列的序号获取每一列的值
Object value = rs.getObject(i);
if (value != null) {
// 通过列的序号获取每一列的列名
String columnName = md.getColumnName(i);
// 因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
Field f = c.getDeclaredField(columnName);
// 赋予私有属性的赋值权限
f.setAccessible(true);
// 使用反射,把value给到对象t的属性中
f.set(t,value);//理解为:把value赋值给对象t的columnName属性,相对于set方法
}
}
// 把对象存入集合中
tList.add(t);
}
// 7.关闭资源
statement.close();
con.close();
}catch (Exception e){
e.printStackTrace();
}
return tList;
}
}