J2EE开发中减少编写代码工作量的几种方法

减少编写代码工作量的几种方法:

参考项目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 <T> List<T> getAll(Class<T> 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


你可能感兴趣的:(J2EE)