zoukankan      html  css  js  c++  java
  • JAVA反射实现JdbcTemplate中查询方法 返回的结果集自动封装成对应的JAVABean对象

     

    只能查询单张表的数据 封装到对应的JAVABean对象中 查询的列数随意

    可以不查询全部列  但JAVABean属性 整数只能使用int或Integer 小数使用double或Double 

    我这个模板查询方法 是我自己写的 不是用spring的那个JdbcTemplate模板,不过是模仿spring的JdbcTemplate模板,

    可以把我这个处理查询结果集的代码 放到spring的JdbcTemplate模板中那个处理结果集接口要重写的方法里面 处理结果集

     1 public List query(String sql, Object[] values, Class cls){ //第一个参数 sql语句 第二个参数 查询语句参数的数组 第三个封装数据JAVA bean对象的class对象
     2         ArrayList list=new ArrayList();
     3         try {
     4             conn=DBUtil.getConnection();
     5             ps=conn.prepareStatement(sql);
     6             if(values!=null){
     7                 for(int i=0;i<values.length;i++){
     8                         ps.setObject(i+1, values[i]);
     9                 }
    10             }
    11             rs=ps.executeQuery();
    12             ResultSetMetaData data=rs.getMetaData(); //得到当前结果集所有列的信息
    13             ArrayList<String> ColumnNames=new ArrayList<String>();//创建集合存储列名
    14             for(int i=1;i<=data.getColumnCount();i++){ //遍历每一列的名字 添加到集合
    15                 ColumnNames.add(data.getColumnName(i));
    16             }    
    17             
    18             while (rs.next()) {
    19                 Object obj=cls.newInstance(); //创建目标对象
    20                 Field[] fields=cls.getDeclaredFields();//得到所有属性
    21                 for (int i = 0; i < ColumnNames.size(); i++) {//遍历列名集合 
    22                     Field f=null;
    23                     for (Field fi : fields) { //遍历属性集合 判断属性名 找到和列名相同的属性对象
    24                         if(fi.getName().toUpperCase().equals(ColumnNames.get(i))){
    25                             f=fi;
    26                             break;
    27                         }
    28                     }
    29                         if(f!=null){
    30                         Object value=null;//数据库列的值
    31                         if(f.getType()==Integer.class||f.getType()==int.class){ //数字类型需要特殊处理 
    32                             value=rs.getInt(f.getName());
    33                         }else if(f.getType()==Double.class||f.getType()==double.class){
    34                             value=rs.getDouble(f.getName());
    35                         }else{
    36                             value=rs.getObject(f.getName());//字符 时间类型通过这个方法获取
    37                         }
    38 
    39                           if(value==null){ //如果数据库中列的值为null 获取到的值也为null 所以结束本次循环
    40                              continue; 
    41                           }
    42                        
    43                         PropertyDescriptor prop=new PropertyDescriptor(f.getName(), cls);//创建属性描述对象
    44                         prop.getWriteMethod().invoke(obj,value);//执行set方法 
    45                      
    46                   }        
    47                 }
    48                 
    49                 list.add(obj); //将赋值完成的对象 添加到集合
    50             
    51         }
    52             
    53         } catch (Exception e) {
    54             // TODO Auto-generated catch block
    55             e.printStackTrace();
    56         }finally{
    57             DBUtil.close(conn, rs,ps);
    58         }
    59         
    60         
    61         return list;
    62     }
  • 相关阅读:
    svn的使用
    判断某个ImageView的背景图是否是已知的背景图相等
    关于fragment点击穿透的问题
    使用fragment添加底部导航栏
    HTML基本格式
    Handler机制
    在Android studio中到入Eclipse
    关于即来即停app的功能
    Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比
    大数据对互联网金融的影响
  • 原文地址:https://www.cnblogs.com/java888/p/10395509.html
Copyright © 2011-2022 走看看