至于为什么要用service layer模式,论坛上已有讨论http://www.iteye.com/topic/29867
然而我们都知道,web中出现最多的操作是CURD,这400个java文件中有多少代码是重复的?几乎占了80%甚至更多。编写这样重复的代码是很枯燥无味的,而且如果是由不同人负责不同的模块的分工方式,程序员编码的风格是各不相同(虽然可能有规范约束,但是最后出来的东西还是避免不了的带有程序员个人风格的)。
所以为了节省时间和精力,便做一个程序来生成程序。
只要配置好你的项目名,你的模块名,模块路径,就可以在几秒之内完成一个模块的CURD代码,同时你可以自定义模板。
这是工具的大概设计思路:
由ant处理编译、生成目录的工作,velocity处理程序模板,contentEngine为核心处理程序。
产生的目录结构和代码路径:
模块名
--子模块1
----model
------businessobject
------dao
--------hibernate
----service
------impl
----view
------action
------form
----Exception
--子模块2
...
其中model/businessobject中是pojo和hbm.xml,这个由hibernate工具根据数据库表产生。
我们假设模块名为course,子模块名为table,类名为CourseMember。因篇幅问题,我们只看一个daoImpl的例子。
首先我们利用建立一个daoImpl的模板
ObjectDaoHibernateImpl.vm
${package_Hibernate}
${import_SQLException}
${import_List}
${import_HibernateCallback}
${import_HibernateObjectRetrievalFailureException}
${import_HibernateDaoSupport}
${import_HibernateException}
${import_Query}
${import_Session}
${import_ObjectNameDao}
${import_ObjectName}
${import_Finder}
${import_Page}
${import_Criteria}
${import_Projections}
/**
* The Hibernate implementation of the ${ObjectName}Dao
.
*
* @author ${Author}
* @see ${ObjectName}Dao
*/
public class ${ObjectName}DaoHibernateImpl extends HibernateDaoSupport implements ${ObjectName}Dao {
/**
* Default constructor.
*/
public ${ObjectName}DaoHibernateImpl() {
super();
}
/**
* @see ${ObjectName}Dao#save${ObjectName}(${ObjectName})
*/
public ${ObjectName} save${ObjectName}(${ObjectName} ${objectname}) {
this.getHibernateTemplate().save(${objectname});
return ${objectname};
}
/**
* @see ${ObjectName}Dao#get${ObjectName}(String)
*/
public ${ObjectName} get${ObjectName}(String id) {
return (${ObjectName})this.getHibernateTemplate().load(${ObjectName}.class, id);
}
/**
* @see ${ObjectName}Dao#update${ObjectName}(${ObjectName})
*/
public void update${ObjectName}(${ObjectName} ${objectname}) {
this.getHibernateTemplate().update(${objectname});
}
/**
* @see ${ObjectName}Dao#delete${ObjectName}(${ObjectName})
*/
public void delete${ObjectName}(${ObjectName} ${objectname}) {
this.getHibernateTemplate().delete(${objectname});
}
/**
* @see ${ObjectName}Dao#getAll${ObjectName}s()
*/
public List getAll${ObjectName}s() {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
StringBuffer sb = new StringBuffer(100);
//sb.append("select distinct ${objectname} ");
sb.append("SELECT ${objectname} ");
sb.append("FROM ${ObjectName} ${objectname} ");
sb.append("order by ${objectname}.id");
Query query = session.createQuery(sb.toString());
List list = query.list() ;
return list;
}
});
}
public Object query(final ${ObjectName} ${objectname},
final int pageNo, final int maxResult) {
return getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria=session.createCriteria(${ObjectName}.class);
Criteria anothercriteria=session.createCriteria(${ObjectName}.class);
criteria.setProjection(Projections.rowCount());
// if (!${objectname}.get${objectname}Name().equals("")
// && ${objectname}.get${objectname}Name() != null) {
// criteria.add(Expression.ilike("contactName","%"+customerContactForm.getContactName()+"%"));
// anothercriteria.add(Expression.ilike("contactName","%"+customerContactForm.getContactName()+"%"));
// }
Integer count=(Integer)criteria.uniqueResult();
List list=anothercriteria.setFirstResult((pageNo-1)*maxResult).setMaxResults(maxResult).list();
Page page=new Page(count.intValue(), maxResult, pageNo);
return new Finder(list, page);
}
});
}
public boolean deleteBybatch(final String[] chxSong) {
StringBuffer cusIdList = new StringBuffer(200);
cusIdList.append("delete from ${ObjectName} where ${objectName}No=");
for (int i = 0; i < chxSong.length; i++) {
if (i == 0)
cusIdList.append(chxSong[i]);
else
cusIdList.append(" or ${objectName}No=" + chxSong[i]);
}
this.getSession().createQuery(cusIdList.toString()).executeUpdate();
return true;
}
}
声明:
1)其中${}是模板语言中的变量,变量的来源一是通过对应的.properties文件,另外是通过参数传递。
2)注释部分因是分页查询条件,这个涉及到具体字段,无法预知,所以需要在产生代码之后程序员根据查询条件自行修改。另外也涉及到个人项目的分页方法,这个根据具体情况自定义模板。
template.properties
公共属性文件,是所有template文件(.vm)的变量声明处,这个会在后面代码中进行设置。
对于属性文件,可有两种方式:
一是针对每一个template模板文件都建立一个属性文件,优点是在后面ant中设置的参数就少了,而且方便修改。缺点是模板文件数量增多,另外公共部分声明重复。
二是设定一个公共属性文件,将特定的变量交给参数传递。
我们这里先用公共属性文件的方式。
Author = Cmas R&D Team import_Arraylist = import java.util.ArrayList; import_List = import java.util.List; import_Set = import java.util.Set; import_FacesException = import javax.faces.FacesException; import_BeanUtils = import org.apache.commons.beanutils.BeanUtils; import_Log = import org.apache.commons.logging.Log; import_LogFactory = import org.apache.commons.logging.LogFactory; import_SQLException = import java.sql.SQLException; import_HibernateCallback = import org.springframework.orm.hibernate3.HibernateCallback; import_HibernateObjectRetrievalFailureException = import org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException; import_HibernateDaoSupport = import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import_HibernateException = import org.hibernate.HibernateException; import_Query = import org.hibernate.Query; import_Session = import org.hibernate.Session; import_Map = import java.util.Map; import_HashMap = import java.util.HashMap; import_Iterator = import java.util.Iterator; import_Criteria=import org.hibernate.Criteria; import_Projections=import org.hibernate.criterion.Projections; import_DispatchActionSupport=import org.springframework.web.struts.DispatchActionSupport; import_Action=import org.apache.struts.action.*; import_HttpServletRequest=import javax.servlet.http.HttpServletRequest; import_HttpServletResponse=import javax.servlet.http.HttpServletResponse; import_BeanUtils=import org.apache.commons.beanutils.BeanUtils; import_DataIntegrity=import org.springframework.dao.DataIntegrityViolationException;