减少编写代码工作量的几种方法:
参考项目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); }