關于代碼生成器反復生成代碼的設計。
我以前的做法是先生成盡可能詳細的代碼。
(生成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){
????? //手工的代碼了
??? }
}
以上代碼,除了斜線后的注釋,都是代碼生成器生成的,受篇幅限制,作了大量的刪減
?