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

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

我需要的这个工具能够读取数据库表结构,通过对字段类型、名称等分析得到需要的各种变量,根据模板生成相应的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. <#list table.columns as column>
  10. /**
  11. * ${column.remarks}
  12. */
  13. private ${column.simpleJavaType} ${column.columnNameLower};
  14. </#list>
  15. <@generateJavaColumns/>
  16. <#macro generateJavaColumns>
  17. <#list table.columns as column>
  18. <#if column.isDateTimeColumn>
  19. public String get${column.columnName}String() {
  20. return DateConvertUtils.format(get${column.columnName}(), FORMAT_${column.constantName});
  21. }
  22. public void set${column.columnName}String(String ${column.columnNameLower}) {
  23. set${column.columnName}(DateConvertUtils.parse(${column.columnNameLower}, FORMAT_${column.constantName},${column.simpleJavaType}.class));
  24. }
  25. </#if>
  26. public void set${column.columnName}(${column.simpleJavaType} ${column.columnNameLower}) {
  27. this.${column.columnNameLower} = ${column.columnNameLower};
  28. }
  29. public ${column.simpleJavaType} get${column.columnName}() {
  30. return this.${column.columnNameLower};
  31. }
  32. </#list>
  33. </#macro>

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. * <query all>
  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<String, Object> paramMap, Map<String, String> orderMap, int pageNum,
  25. int pageSize)
  26. throws DAOException
  27. {
  28. return super.listInstances(${className}.class, paramMap, orderMap, pageNum, pageSize);
  29. }
  30. /**
  31. *
  32. * <find one by id>
  33. * @param serial
  34. * @throws DAOException
  35. */
  36. public ${className} find${className}By${table.pkColumn.columnName}(${table.pkColumn.simpleJavaType} ${table.pkColumn.columnNameFirstLower})
  37. throws DAOException
  38. {
  39. return (${className})super.findById(${className}.class, ${table.pkColumn.columnNameFirstLower});
  40. }
  41. /**
  42. *
  43. * <save one>
  44. * @param ${table.classNameFirstLower}
  45. * @throws DAOException
  46. */
  47. public ${table.pkColumn.simpleJavaType} save${className}(${className} ${table.classNameFirstLower})
  48. throws DAOException
  49. {
  50. return (${table.pkColumn.simpleJavaType})super.saveInstance(${table.classNameFirstLower});
  51. }
  52. /**
  53. *
  54. * <update one>
  55. * @param ${table.classNameFirstLower}
  56. * @throws DAOException
  57. */
  58. public void update${className}(${className} ${table.classNameFirstLower})
  59. throws DAOException
  60. {
  61. super.updateInstance(${className});
  62. }
  63. /**
  64. * <check one is have?>
  65. * @param paramMap
  66. * @return
  67. * @throws DAOException
  68. */
  69. public boolean check${className}IsHaveByAttr(Map<String, Object> paramMap)
  70. throws DAOException
  71. {
  72. StringBuffer sqlBuffer = new StringBuffer();
  73. sqlBuffer.append("SELECT COUNT(*) FROM ${table.sqlName} T ");
  74. sqlBuffer.append("WHERE T.${table.pkColumn.sqlName} = ? ");
  75. BigDecimal big = (BigDecimal)super.findUniqueResultBySQLWithParams(sqlBuffer.toString(), paramMap.get("${table.pkColumn.columnNameFirstLower}"));
  76. return big.intValue() > 0 ? false : true;
  77. }
  78. /**
  79. * <update some>
  80. * @param ${table.classNameFirstLower}List
  81. * @return
  82. * @throws DAOException
  83. */
  84. public void update${className}Batch(List<${className}> ${table.classNameFirstLower}List)
  85. throws DAOException
  86. {
  87. super.updateBatchInstance(${table.classNameFirstLower}List);
  88. }
  89. /**
  90. *
  91. * <delete one>
  92. * @param ${table.classNameFirstLower}
  93. * @throws DAOException
  94. */
  95. public void delete${className}(${className} ${table.classNameFirstLower})
  96. throws DAOException
  97. {
  98. super.deleteInstance(${table.classNameFirstLower});
  99. }
  100. }

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

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

接口和实现:

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

rapid-generator JAVA代码生成器的更多相关文章

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

    转自:http://www.cnblogs.com/zhuYears/archive/2012/02/29/2373491.html 告别无止境的增删改查--Java代码生成器 有感于马上要做个比较大 ...

  2. 【转】20个Java 代码生成器

    From: http://www.cnblogs.com/skyme/archive/2011/12/22/2297592.html 1.1 CodeSmith 一款人气很旺国外的基于模板的dotne ...

  3. Java代码生成器CodeX4J介绍

    用代码生成器生成一些固定的或有规律的代码,可以有效的提高工作效率.我写了个开源的,放在了GitHub上,希望能对有需要的朋友有所帮助. GitHub代码地址https://github.com/jac ...

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

    对于一个比较大的业务系统,我们总是无止境的增加,删除,修改,粘贴,复制,想想总让人产生一种抗拒的心里.那有什么办法可以在正常的开发进度下自动生成一些类,配置文件,或者接口呢?   有感于马上要做个比较 ...

  5. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  6. Java代码生成器多表配置优化,增加自定义实体功能

    目录 前言 多表配置优化 自定义实体 杂谈 结语 前言   最近利用零碎的时间对代码生成器做了进一步更新:优化多表配置模块,增加自定义实体功能,美化单表和多表配置的UI界面,修复用户反馈的若干bug, ...

  7. 这就是Java代码生成器的制作流程

    1. 前言 前几天写了篇关于Mybatis Plus代码生成器的文章,不少同学私下问我这个代码生成器是如何运作的,为什么要用到一些模板引擎,所以今天来说明下代码生成器的流程. 2. 代码生成器的使用场 ...

  8. Java代码生成器Easy Code

    EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据库相关的代码都可以通过自定义模板来生成.支持数据库类型与java ...

  9. Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!

    目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...

随机推荐

  1. 转发-[原创]ASR1K 在Rommon导入IOS-XE启动

    在相对较老的设备平台可以通过在rommon下使用以下命令导入IOS. rommon 1 > IP_ADDRESS=192.168.1.2rommon 2 > IP_SUBNET_MASK= ...

  2. Nexus-FEX基础配置

    1.FEX基本配置feature fex fex 100  pinning max-links 1  >>>>该值默认就是1  description "FEX100 ...

  3. Educational Codeforces Round 82 C. Perfect Keyboard

    Polycarp wants to assemble his own keyboard. Layouts with multiple rows are too complicated for him ...

  4. php学习函数如何执行的

    入口栈abc(4)--------abc(4)------abc(3)-----abc(2)再返回上一层栈,执行完后返回上一层.输出$n=2-------$n=2-------$n=3

  5. zip 多维

    ll=zip([[1,3],[2,4]],[[88,99],[66,55]])a=zip(*ll)# print(list(a)) #[([1, 3], [2, 4]), ([88, 99], [66 ...

  6. python第一章 python基础编程

    第一次学习python 首先python对于我来说是我学习的第三门语言,之前大一学习过了c和c++这两门语言. 接触一个新语言,首先应该的是搭载一下编译的环境.我们是老师给我们上传了的python3安 ...

  7. git 修改分支 删除分支 新增分支

    一.修改分支名 1.本地分支重命名 git branch -m oldName newName 2.将重命名后的分支推送到远程 git push origin newName 3.重新更新所有分支 g ...

  8. jvm学习:类的加载、连接、初始化、常量

    类在jvm中有这几个过程类的加载.连接.初始化.使用.卸载 类的加载 类的加载是将class文件中的二进制数据加载到内存中,将其放在运行时的数据区:方法区内,然后在内存中创建一个 java.lang. ...

  9. Spring开发踩坑记录

    #1 @EnableEurekaServer无法正常import原因是spring-cloud-dependencies版本太低,改成高版本的Edgware.SR4即可.参考:https://www. ...

  10. HTML5模板引擎 Thymeleaf 教程(转)

    原文:http://www.open-open.com/lib/view/open1383622135586.html Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非 ...