protected <OBJ> List<OBJ> autoInject(OBJ o){
List<OBJ> list=new ArrayList<OBJ>();
//rs 的数据写入到 list<po对象>
// rs里 每一次next 当前一组结果 对应着 一个po对象
// rs里 一组数据中每一个get数据,对应着po中的一个属性
// rsmd 能获得字段的数量,po层的属性名及set方法
// 思路:
// 便利rs 获取每一条数据 嵌套便利rsmd的字段,遍历每个字段时,去po对象的内省中查找对应的set方法
// 根据rsmd中的java数据类型 转换成 po层的对应数据类型
try {
rs.beforeFirst();
ResultSetMetaData rsmd=rs.getMetaData();
int colcount =rsmd.getColumnCount();
//反射
Class c=o.getClass();//获取传入对象的反射
BeanInfo bi=Introspector.getBeanInfo(c);
PropertyDescriptor[] pds=bi.getPropertyDescriptors();//获取内省
while(rs.next()){
//一条数据 要遍历 每个字段
OBJ obj=(OBJ)c.getConstructor().newInstance();//创建一个新的对象
//通过反射调用无参创建一个新的对象 每遍历一回就创建一个实例
for (int i = 1; i <=colcount; i++) {
//便利每个字段
for (PropertyDescriptor pd : pds) {
if(pd.getName().equalsIgnoreCase(rsmd.getColumnName(i))){
//如果内省的属性名,和结果集的字段名相同
//接下来需要将rs的数据转移至po
String type=pd.getPropertyType().getSimpleName();
//获取反射的数据类型 简写 String Integer
// String type=pd.getPropertyType().getName();
//获取反射的数据类型全名 java.lang.String java.long.Integer
// Method write=c.getMethod("封装方法名", java.lang.String.class);
Method write=null;
try {
write=c.getMethod(tranSetName(pd.getName()), String.class);
write.invoke(obj, rs.getString(i));
} catch (Exception e) {
// TODO: handle exception
}
if(write!=null)break;//获取一个不存在的方法时会报异常。如果能找到这个方法 write变量就不是null的
write=pd.getWriteMethod();
//switch的作用: 转化数据类型。而有一些数据类型的转化比较复杂,可以自定义转换规则
switch (type) {
case "String":
write.invoke(obj,rs.getString(i));
break;
case "Integer":
write.invoke(obj,rs.getObject(i)==null?null:rs.getInt(i));
break;
case "Double":
write.invoke(obj,rs.getObject(i)==null?null:rs.getDouble(i));
break;
case "Short":
write.invoke(obj,rs.getObject(i)==null?null:rs.getShort(i));
break;
case "Date":
write.invoke(obj,rs.getTimestamp(i));
break;
}
break;//找到匹配的结果后就可以结束内循环。
}
}list.add(obj);
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return list;
}
private String tranSetName(String var){
//将属性的首字母改成大写+set前缀
char[] cs =var.toCharArray();
cs[0] = Character.toUpperCase(cs[0]);
var="set" +String .copyValueOf(cs);
return var;
}
impl里相对应的方法
@Override
public List<DemoTab> fidall() {
// TODO Auto-generated method stub
List<DemoTab> list =null;
open();
String sql="SELECT * FROM DEMO";
try {
stm=con.createStatement(1004,1007);
rs=stm.executeQuery(sql);
show();//要都搜完以后才能展示。所以在rs下
list = autoInject(new DemoTab());
// list = new ArrayList<DemoTab>();
// while(rs.next()){
// DemoTab dt=new DemoTab();
// dt.setDemopk(rs.getString(1));
// dt.setCol2(rs.getString(2));
// dt.setCol3(rs.getString(3));
// dt.setCol4(rs.getObject(4)==null?null:rs.getInt(4));
// list.add(dt);
// }
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
close();
return list;
}
主方法执行
DemoDao dd=new DDImpl();
List<DemoTab> list=dd.fidall();
System.out.println(list);