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     }