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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM