J2EE開發中減少編寫程式碼工作量的幾種方法

gudesheng發表於2008-01-03

減少編寫程式碼工作量的幾種方法:

參考專案Struts2,Appfuse,Springside,Easyjf

1 使用模板生成程式碼
  自定義模板變數和替換邏輯,velocity,freemaker,eclipse jet
  基於annatation的xdoclet,java ee5
  基於UML,XMI的MDA

2 使用反射機制

  a) 完成物件-物件,物件到集合的複製
     直接用commons-beanutils
 
  b) 完成Recordset到domain object的轉換
     下面是一種方法:

    /////////////////////////////////////////////////////////////////////////////
    //Function: 完成ResultSet物件向ArrayList物件為集合的物件的轉化
    //Para:sql,指定的查詢Sql
   //Para:className,Sql相對應得JavaBean/FormBean類的名字
   //Return:以類className為一條記錄的結果集,完成ResultSet物件向ArrayList物件為集//合的className物件的轉化
  //////////////////////////////////////////////////////////////////////////////
  public ArrayList Select(String sql,String className){
    ArrayList paraList=new ArrayList();
    try{
      if (conn == null){
        Connection();
      }
      PreparedStatement stmt = conn.prepareStatement(sql);
      ResultSet rs = stmt.executeQuery();
      String recordValue="";
      Object c1=null;
      paraList=new ArrayList();
      ResultSetMetaData rsmd = rs.getMetaData();
      int columnCount = rsmd.getColumnCount();
      while (rs.next()){
          c1=Class.forName(className).newInstance();
          for (int i=1; i<=columnCount; i++) {
            if(rs.getString(rsmd.getColumnName(i))!=null){
              recordValue=rs.getString(rsmd.getColumnName(i));
            }else{
              recordValue="";
            }
            Method m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),new Class[]{recordValue.getClass()});
            m.invoke (c1, new Object[]{recordValue});
          }
          paraList.add(c1);
      }
    }catch(SQLException ex){
     
    }catch(ClassNotFoundException e){
    }catch(NoSuchMethodException e) {
    }catch(InvocationTargetException e){
    }catch (IllegalAccessException e){
    }catch(InstantiationException e){
    } finaly{
        closeConnection();
    return paraList;
    }
      }

    在JavaBean封裝的商業邏輯中呼叫Select 方法,然後在JSP頁面上顯示出來:

   //Function:取得使用者列表
  //Para:
  //Return:返回使用者列表
  /////////////////////////////////////////////////////////////////////////////
  public ArrayList getUsers(){
      ArrayList ret=null;
      DatabaseManage db=new DatabaseManage();
      String sql=" select usr_id,usr_name "
          +" from users " ;
      ret=db.Select(sql," com.bhsky. webis.system.UsersActionForm");
      return ret;
  }

  還有一種方法:比如在EasyJf-DBO裡面將Recordset放到HashMap裡面,然後使用beanutils複製到物件裡面,相當於比上面的方法多了一個環節。

  c) 在基類(抽象類)裡面使用,主要用在對物件的儲存,更新,刪除上
     在DAO中實現CRUD的操作
        public void insert(Object o) {
  getSqlMapClientTemplate().insert(o.getClass().getName() + POSTFIX_INSERT, o);
 }
     在Struts Action中實現domain object到formbean的轉換,還可以實現其它的全域性操作,例如日誌
 

3 使用範型的方法,主要用在查詢方法中
  在基類(抽象類)中使用,主要用在查詢的方法上
   public List getAll(Class entityClass) {
  return getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null);
 }

  對比一下反射的用法:
    public List getObjects(Class clazz) {
        return getSqlMapClientTemplate().queryForList(getSelectQuery(ClassUtils.getShortName(clazz)), null);
    }
 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1504215


相關文章