tbwshc

          反射機(jī)制在JDBC連接中的使用

          1、數(shù)據(jù)庫當(dāng)中的表設(shè)計



           

          2、對應(yīng)數(shù)據(jù)表的實(shí)體Bean (id為主鍵)

           

           

           

          Java代碼  
          1. public class EnginConfigVO {   
          2.     int id = 0;   
          3.     int THREADS_COUNT;   
          4.   
          5.     /**  
          6.      * @return the id  
          7.      */  
          8.     public int primaryGetId() {   
          9.         return id;   
          10.     }   
          11.     /**  
          12.      * @param id the id to set  
          13.      */  
          14.     public void primarySetId(int id) {   
          15.         this.id = id;   
          16.     }   
          17.     /**  
          18.      * @return the tHREADS_COUNT  
          19.      */  
          20.     public int getTHREADS_COUNT() {   
          21.         return THREADS_COUNT;   
          22.     }   
          23.   
          24.     /**  
          25.      * @param tHREADS_COUNT the tHREADS_COUNT to set  
          26.      */  
          27.     public void setTHREADS_COUNT(int tHREADS_COUNT) {   
          28.         THREADS_COUNT = tHREADS_COUNT;   
          29.     }   
          30. }  

          由于沒有像hibernate那樣的注解機(jī)制,所以只能在主鍵的setter和getter方法上動動手腳primaryGetId() ,primarySetId(int id)

           

          而實(shí)體bean的類名在與數(shù)據(jù)表的匹配上最后多了“vo” 兩個字母,所以在tb下面方法中將這兩個字母剪裁掉。

           

          反射方法: 

          T o 對應(yīng)的就是實(shí)體Bean,這樣的方法當(dāng)然是寫在DAO層中,供上層的service調(diào)用,傳入需要修改的實(shí)體Bean

           

           

          Java代碼  
          1. public <T> void updatePropertiesValues(T o) {   
          2.         StringBuilder sd = new StringBuilder("update ");   
          3.         sd.append(o.getClass().getSimpleName().toLowerCase().substring(0, o.getClass().getSimpleName().length()-2)).append(" ");   
          4.         sd.append("set ");   
          5.         StringBuilder id = new StringBuilder("where ");   
          6.         try {   
          7.             for(Method m : o.getClass().getDeclaredMethods()) {   
          8.                 String name = m.getName();   
          9.                 if (name.startsWith("get")) {   
          10.                     sd.append(name.substring(3).toLowerCase()).append("=");   
          11.                     if(m.invoke(o) instanceof String) {   
          12.                         sd.append("'").append(m.invoke(o)).append("', ");   
          13.                     }else {   
          14.                         sd.append(m.invoke(o)).append(", ");   
          15.                     }   
          16.                 }   
          17.                 if(name.startsWith("primaryGet")) {   
          18.                     id.append(name.substring(10).toLowerCase()).append("=");   
          19.                     if(m.invoke(o) instanceof String) {   
          20.                         id.append("'").append(m.invoke(o)).append("';");   
          21.                     }else {   
          22.                         id.append(m.invoke(o)).append(";");   
          23.                     }   
          24.                 }   
          25.             }   
          26.             sd.delete(sd.length()-2, sd.length());   
          27.             sd.append(" ");   
          28.             sd.append(id);   
          29.         } catch (IllegalArgumentException e) {   
          30.             e.printStackTrace();   
          31.         } catch (IllegalAccessException e) {   
          32.             e.printStackTrace();   
          33.         } catch (InvocationTargetException e) {   
          34.             e.printStackTrace();   
          35.         }   
          36.            
          37.         executeTrans(sd.toString());   
          38.            
          39.     }  

           這樣以后便可以拼湊出完整的sql語句,為我們解決了功能相似代碼的冗余。。

           

          另外在查找時,我們還可以利用發(fā)射機(jī)制,將數(shù)據(jù)庫返回的resultset 對象包裝成List<T>

          Java代碼  
          1. public static <T> List<T> getObjectsList(ResultSet rs, Class<T> k)   
          2.             throws SQLException {   
          3.         List<T> bl = new ArrayList<T>();   
          4.         if (rs != null) {   
          5.             while (rs.next()) {   
          6. //              System.out.println("result is not null");   
          7.                 T o = null;   
          8.                 try {   
          9.                     o = k.newInstance();   
          10.                     for (Method m : k.getDeclaredMethods()) {   
          11.                         String name = m.getName();   
          12.                         if (name.startsWith("set")) {   
          13. //                          System.out.println(rs.getObject(name.substring(3)).getClass().getName());   
          14.                             m.invoke(o, rs.getObject(name.substring(3)));   
          15.                         }   
          16.                     }   
          17.                     bl.add(o);   
          18.                 } catch (InstantiationException e) {   
          19.                     e.printStackTrace();   
          20.                 } catch (IllegalAccessException e) {   
          21.                     e.printStackTrace();   
          22.                 } catch (IllegalArgumentException e) {   
          23.                     e.printStackTrace();   
          24.                 } catch (InvocationTargetException e) {   
          25.                     e.printStackTrace();   
          26.                 }   
          27.             }   
          28.             return bl;   
          29.         }   
          30.         return null;   
          31.     }  

          這樣,我們就可以從底層直接獲得包裝好的List<T>集合。。不足之處,歡迎大家討論。。 

          posted on 2012-08-03 17:30 chen11-1 閱讀(918) 評論(0)  編輯  收藏

          主站蜘蛛池模板: 隆林| 嘉兴市| 武清区| 蛟河市| 肥西县| 高要市| 吴桥县| 宝兴县| 永修县| 台中县| 福安市| 延长县| 温泉县| 临江市| 滨州市| 呈贡县| 双牌县| 鄂托克前旗| 青浦区| 宝兴县| 堆龙德庆县| 九龙城区| 珲春市| 泰兴市| 玉田县| 乌苏市| 沅陵县| 土默特右旗| 富蕴县| 临清市| 卓尼县| 遵义县| 辽阳县| 大新县| 额尔古纳市| 白水县| 友谊县| 周宁县| 安吉县| 远安县| 新民市|