需求:通过反射获取泛型类型和枚举中指定的属性,进行sql语句的拼接
第一步:
- 获取泛型类型
(1)Entity层
(2)在dao层的实现层里
2.在BaseDaoImpi设置泛型类型T:
3.传入entity实体:
获取到的泛型类型:
第二步:
通过反射获取枚举中的内容:
Nano层中的内容:
Table中定义接收内容是表名:
Entity层中的内容:
User中的内容:
看一下返回的类型是什么:
getAnnotation()方法返回该元素的指定类型的注释,如果是这样的注释,否则返回null。
查看返回结果:
获取到所有的字段:
第三步:进行拼接
拿到了表名和id
这是对分页排序的sql语句
//Sql语句拼接:
public T selectBeanById(int id) {
//声明
// conn st rs
Connection conn = null;
Statement st = null;
ResultSet rs = null;
T object = null;
StringBuilder sql=new StringBuilder("select ");
Field[] fields=entityClass.getDeclaredFields();
String idname=null;
for (Field field : fields) {
field.setAccessible(true);
Column column=field.getAnnotation(Column.class);
sql.append(column.name()).append(" , ");
if (field.getAnnotation(ID.class)!=null) {
//如果id注解不为空
idname=column.name();
}
}
//去掉最后一个逗号
sql.deleteCharAt(sql.length() - 2);
//获取表名
String tableName = entityClass.getAnnotation(Table.class).name();
sql.append(" from ").append(tableName).append(" where ").append(idname).append(" = ").append(id);
System.out.println(sql.toString());
try {
// 获取连接
conn = jdbcUtil.getConnection();
//执行语句
st = conn.createStatement();
rs = st.executeQuery(sql.toString());
// rs 拿出查找到的数据
if (rs.next()) {
//true 有数据
// 通过反射,创建一个对象
object = entityClass.newInstance();
// 每一个字段的数据放入对应的 属性中
// object.setName(rs.getString("name"));
for (Field field : fields) {
field.setAccessible(true);
Column column = field.getAnnotation(Column.class);
if (column != null) {
field.set(object, rs.getObject(column.name()));
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}finally {
jdbcUtil.close(conn, st, rs);
}
return object;
}