数据库 自动注入 12.30

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值