基于Ant+Velocity的简单代码生成器的思路与实现

阅读更多
在SSH项目中,我们应用了service layer模式,所以针对一个模块,它就存在pojo、dao、daoImpl、service、serviceImpl,再到struts中的action、form。假设设计是面向数据库的,针对一个数据库表,那么就要产生7个java文件,如果还要做异常处理,那么就是8个java文件。如果数据库有50个表,那么就是50*8=400个java文件。工程不小。

至于为什么要用service layer模式,论坛上已有讨论http://www.iteye.com/topic/29867

然而我们都知道,web中出现最多的操作是CURD,这400个java文件中有多少代码是重复的?几乎占了80%甚至更多。编写这样重复的代码是很枯燥无味的,而且如果是由不同人负责不同的模块的分工方式,程序员编码的风格是各不相同(虽然可能有规范约束,但是最后出来的东西还是避免不了的带有程序员个人风格的)。

所以为了节省时间和精力,便做一个程序来生成程序。
只要配置好你的项目名,你的模块名,模块路径,就可以在几秒之内完成一个模块的CURD代码,同时你可以自定义模板。

这是工具的大概设计思路:
基于Ant+Velocity的简单代码生成器的思路与实现_第1张图片

由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;

你可能感兴趣的:(velocity,Ant,Hibernate,DAO,Apache)