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