參考項目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);
}