关于代码生成器反复生成代码的设计。
我以前的做法是先生成尽可能详细的代码。
(生成findby方法基本把每个字段都列在了查询条件里,包括一些基本用不到的)
然后只需要复制其中的代码片断来完成需要新加的方法。
前几天在表中增加字段之后,手工写了不少代码 :(((
受 charon@xxx 的回复的提示,结合myeclipse生成 pojo的思路,
对我的代码生成器进行改进,作以下处理。
以dao为例(其它logic等均作类似处理),定义两个接口。和对应两个实现。
写成四个模板文件。
比如IpojoBaseDAO.java,pojoBaseDAOImpl.java abstract的,但是实现IpojoBaseDAO里的方法。
这个是可以反复生成的。
再定义两个继承类模板。
IpojoDAO.java 继承自IpojoBaseDAO
pojoDAOImpl.java 继承自 pojoBaseDAOImpl。实现IpojoDAO。
这两个文件只需要生成一次,以后自己增加的代码都在这里。
在第一次生成好代码之后,把这两文件名后缀改为.bak.这样再运行代码生成器的时候就不会再生成了。
不废话了,看生成的效果。
接口:
IBlogPostBaseDAO.java
////本文件可以反复生成。
public interface IBlogPostBaseDAO{
void addBlogPost(BlogPost blogPost);
List findBlogPostby(
java.lang.String blogNo,
java.util.Date addtime_begin,
java.util.Date addtime_end,
java.lang.String blogUserName,
java.lang.String blogTitle,
java.lang.String blogContent,
java.lang.String blogSummary,
Pagination page);
}
IBlogPostDAO.java
//本文件只需要生成一次
public interface IBlogPostDAO extends IBlogPostBaseDAO{
void testBlogPost(BlogPost blogPost); //在这里增加手工补充的具体接口方法
}
BlogPostHibernateBaseDAO.java
//本文件可以反复生成。
public class BlogPostHibernateBaseDAO extends HibernateBaseDAOSupport implements IBlogPostDAO {
private static final transient Logger log = Logger.getLogger(BlogPostHibernateBaseDAO.class);
public BlogPostHibernateBaseDAO() {
}
public void addBlogPost(BlogPost blogPost){
this.getHibernateTemplate().save(blogPost);
}
//多条件分页查询
public List findBlogPostby(
final java.lang.String blogNo,
final java.util.Date addtime_begin,
final java.util.Date addtime_end,
final java.lang.String blogUserName,
final java.lang.String blogTitle,
final java.lang.String blogContent,
final java.lang.String blogSummary,
final Pagination page){
return (List)this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws SQLException,
HibernateException {
Criteria ca = session.createCriteria(BlogPost.class);
if (blogNo != null && blogNo.length() > 0) {
ca.add(Expression.like("blogNo", blogNo, MatchMode.ANYWHERE));
}
if (addtime_begin != null) {
ca.add(Expression.ge("addtime", addtime_begin));
}
if (addtime_end != null) {
ca.add(Expression.le("addtime", addtime_end));
}
if (blogUserName != null && blogUserName.length() > 0) {
ca.add(Expression.like("blogUserName", blogUserName, MatchMode.ANYWHERE));
}
if (blogTitle != null && blogTitle.length() > 0) {
ca.add(Expression.like("blogTitle", blogTitle, MatchMode.ANYWHERE));
}
if (blogContent != null && blogContent.length() > 0) {
ca.add(Expression.like("blogContent", blogContent, MatchMode.ANYWHERE));
}
if (blogSummary != null && blogSummary.length() > 0) {
ca.add(Expression.like("blogSummary", blogSummary, MatchMode.ANYWHERE));
}
if (page != null) {
page.setTotalNum(((Integer) ca.setProjection(Projections.
rowCount()).uniqueResult()).intValue());
}
ca.setProjection(null);
ca.addOrder(Order.desc("addtime"));//
if (page != null) {
ca.setMaxResults(page.getPageSize());
ca.setFirstResult(page.getStartIndex());
}
return ca.list();
}
}, true);
}
}
BlogPostHibernateDAO.java
//本文件只需要生成一次
public class BlogPostHibernateDAO extends BlogPostHibernateBaseDAO implements IBlogPostDAO{
private static final transient Logger log = Logger.getLogger(BlogPostHibernateDAO.class);
public BlogPostHibernateDAO() {
}
public void testBlogPost(BlogPost blogPost){
//手工的代码了
}
}
以上代码,除了斜线后的注释,都是代码生成器生成的,受篇幅限制,作了大量的删减