告别无止境的增删改查:Java代码生成器

有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘贴复制,顿时脑后升起一阵凉风。于是想到个找或者写一个Java代码的生成器,这样在正常开发进度下,也能余下更多的时间去做些别的事情。

创新互联IDC提供业务:成都服务器托管,成都服务器租用,成都服务器托管,重庆服务器租用等四川省内主机托管与主机租用业务;数据中心含:双线机房,BGP机房,电信机房,移动机房,联通机房。

闲话少说,首先总结下需求:

我需要的这个工具能够读取数据库表结构,通过对字段类型、名称等分析得到需要的各种变量,根据模板生成相应的pojo类、hibernate的xml配置文件、dao和service的接口和类。

需求看起来很简单,但是一是没搞过这样的小工具,二是技术不过关,所以还是想到了找找有没有开源的代码拿过来根据自己的需求改。

于是找到了rapid-generator这个开源工具,同学们可以下载rapid-generator直接使用,根据自己的需求写好模板就行了。

由于自己项目中的特殊情况和公司规范等因素,另外也是想学习下别人的设计,所以我对源码进行了删减和功能的修改。

来看下主要的类:

Table:根据表结构建立的对象。

Column:根据表中每列建立的对象。

Generator:生成器核心类,主要负责根据表对象和读取FreeMarker模板生成最后的java代码文件。

GeneratorControl:控制生成过程等的一些参数,例如文件是否覆盖、文件编码等。

GeneratorProperties:读取配置文件的类,配置文件包括数据库连接信息和一些基本的参数配置。

下面来看一下模板的编写:

pojo模板:

 
 
 
 
  1. <#include "/java_copyright.include">
  2. <#assign className = table.className>   
  3. <#assign classNameLower = className?uncap_first> 
  4. package ${basepackage}.pojo.${mpackage}.${table.classNameFirstLower};
  5. <#include "/java_imports.include">
  6. import com.linkage.agri.pojo.base.BaseEntity;
  7. public class ${className} extends BaseEntity {
  8.     private static final long serialVersionUID = 5454155825314635342L;
  9.     
  10.     <#list table.columns as column>
  11.     /**
  12.      * ${column.remarks}
  13.      */
  14.     private ${column.simpleJavaType} ${column.columnNameLower};
  15.     
  16. <@generateJavaColumns/>
  17. <#macro generateJavaColumns>
  18.     <#list table.columns as column>
  19.         <#if column.isDateTimeColumn>
  20.     public String get${column.columnName}String() {
  21.         return DateConvertUtils.format(get${column.columnName}(), FORMAT_${column.constantName});
  22.     }
  23.     public void set${column.columnName}String(String ${column.columnNameLower}) {
  24.         set${column.columnName}(DateConvertUtils.parse(${column.columnNameLower}, FORMAT_${column.constantName},${column.simpleJavaType}.class));
  25.     }
  26.             
  27.     public void set${column.columnName}(${column.simpleJavaType} ${column.columnNameLower}) {
  28.         this.${column.columnNameLower} = ${column.columnNameLower};
  29.     }
  30.     
  31.     public ${column.simpleJavaType} get${column.columnName}() {
  32.         return this.${column.columnNameLower};
  33.     }
  34.     

FreeMarker的基本语法可以看下FreeMarker中文手册。

${}可以引用很多变量,这些变量包括:环境变量、table对象、配置变量等,这些变量都装在一个map里,如果自己有特殊需求,当然可以修改源码来装载更多的变量值。

注意:当变量为对象时,访问对象的属性是通过get方法来访问的。例如${table.classNameFirstLower},是引用 table对象的getNameFirstLower()方法,即使table对象中没有nameFirstLower这个属性也能够引用。

再看下我写的dao的模板:

 
 
 
 
  1. <#include "/java_copyright.include">
  2. <#assign className = table.className>   
  3. <#assign classNameLower = className?uncap_first>   
  4. package ${basepackage}.dao.${mpackage}.${table.classNameFirstLower};
  5. import java.math.BigDecimal;
  6. import java.util.List;
  7. import java.util.Map;
  8. import com.linkage.agri.dao.base.AbstractHibernateDAO;
  9. import com.linkage.agri.exception.DAOException;
  10. import ${basepackage}.pojo.${mpackage}.${classNameLower}.${className};
  11. <#include "/java_imports.include">
  12. public Class ${className}DAOImpl extends AbstractHibernateDAO implements ${className}DAO
  13. {
  14.     /**
  15.      * 
  16.      * @param paramMap
  17.      * @param orderMap
  18.      * @param pageNum
  19.      * @param pageSize
  20.      * @return
  21.      * @throws DAOException
  22.      */
  23.     @SuppressWarnings
  24.     public List<${className}> queryList${className}ByAttr(Map paramMap, Map orderMap, int pageNum,
  25.         int pageSize)
  26.         throws DAOException
  27.     {
  28.         return super.listInstances(${className}.class, paramMap, orderMap, pageNum, pageSize);
  29.     }
  30.     
  31.     /**
  32.      * 
  33.      * 
  34.      * @param serial
  35.      * @throws DAOException
  36.      */
  37.     public ${className} find${className}By${table.pkColumn.columnName}(${table.pkColumn.simpleJavaType} ${table.pkColumn.columnNameFirstLower})
  38.         throws DAOException
  39.     {
  40.         return (${className})super.findById(${className}.class, ${table.pkColumn.columnNameFirstLower});
  41.     }
  42.     
  43.     /**
  44.      * 
  45.      * 
  46.      * @param ${table.classNameFirstLower}
  47.      * @throws DAOException
  48.      */
  49.     public ${table.pkColumn.simpleJavaType} save${className}(${className} ${table.classNameFirstLower})
  50.         throws DAOException
  51.     {
  52.         return (${table.pkColumn.simpleJavaType})super.saveInstance(${table.classNameFirstLower});
  53.     }
  54.     
  55.     /**
  56.      * 
  57.      * 
  58.      * @param ${table.classNameFirstLower}
  59.      * @throws DAOException
  60.      */
  61.     public void update${className}(${className} ${table.classNameFirstLower})
  62.         throws DAOException
  63.     {
  64.         super.updateInstance(${className});
  65.     }
  66.     
  67.     /**
  68.      * 
  69.      * @param paramMap
  70.      * @return
  71.      * @throws DAOException
  72.      */
  73.     public boolean check${className}IsHaveByAttr(Map paramMap)
  74.         throws DAOException
  75.     {
  76.         StringBuffer sqlBuffer = new StringBuffer();
  77.         sqlBuffer.append("SELECT COUNT(*) FROM ${table.sqlName} T ");
  78.         sqlBuffer.append("WHERE T.${table.pkColumn.sqlName} = ? ");
  79.         
  80.         BigDecimal big = (BigDecimal)super.findUniqueResultBySQLWithParams(sqlBuffer.toString(), paramMap.get("${table.pkColumn.columnNameFirstLower}"));
  81.         return big.intValue() > 0 ? false : true;
  82.     }
  83.     
  84.     /**
  85.      * 
  86.      * @param ${table.classNameFirstLower}List
  87.      * @return
  88.      * @throws DAOException
  89.      */
  90.     public void update${className}Batch(List<${className}> ${table.classNameFirstLower}List)
  91.         throws DAOException
  92.     {
  93.         super.updateBatchInstance(${table.classNameFirstLower}List);
  94.     }
  95.     
  96.     /**
  97.      * 
  98.      * 
  99.      * @param ${table.classNameFirstLower}
  100.      * @throws DAOException
  101.      */
  102.     public void delete${className}(${className} ${table.classNameFirstLower})
  103.         throws DAOException
  104.     {
  105.         super.deleteInstance(${table.classNameFirstLower});
  106.     }
  107. }

建立模板是能否解决自己问题的关键,在摸索出门道以后写模板变的十分简单。其实原理很简单,就是用一系列占位符来替换实际的变量值。

模板路径可以按照实际项目中的路径来拜访,生成器可以读取某个路径下所有模板进行生成,结果如下图:

接口和实现:

就说这么多吧,感兴趣的可以研究下这个工具的源码,也DIY出一套自己代码生成工具。不感兴趣的直接写模板就能用。

我只是走在路上,偶尔驻足观赏,偶尔回头看看。

文章题目:告别无止境的增删改查:Java代码生成器
文章分享:http://www.gawzjz.com/qtweb/news21/160871.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联