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 }