tbwshc

反射机制在JDBC连接中的使用

1、数据库当中的表设计



 

2、对应数据表的实体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那样的注解机制,所以只能在主键的setter和getter方法上动动手脚primaryGetId() ,primarySetId(int id)

 

而实体bean的类名在与数据表的匹配上最后多了“vo” 两个字母,所以在tb下面方法中将这两个字母剪裁掉。

 

反射方法: 

T o 对应的就是实体Bean,这样的方法当然是写在DAO层中,供上层的service调用,传入需要修改的实体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语句,为我们解决了功能相似代码的冗余。。

 

另外在查找时,我们还可以利用发射机制,将数据库返回的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 阅读(913) 评论(0)  编辑  收藏