有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘贴复制,顿时脑后升起一阵凉风。于是想到个找或者写一个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. Deepin-linux下的linux的终端下软件安装和卸载方法

    1.方法一: sudo apt update #最好第一步是它 sudo apt install <package_name> --no-upgrade #安装该package但是不升级. ...

  2. CN109241772A发票区块链记录方法、装置、区块链网关服务器和介质(腾讯)

    学习笔记-2 CN109241772A发票区块链记录方法.装置.区块链网关服务器和介质(腾讯) 解决什么问题? 让发票信息记录到区块链的情况下减少发票信息泄露 链上有什么数据? 发行发票事件信息(发票 ...

  3. linux文本处理工具-1

    文件内容: cat ,more,less 文件截取:head,tail 按列抽取:cut 排序和统计:sort,wc ----------------------------------------- ...

  4. 洛谷 T8088 RQY的舞会

    嗯... 题目链接:https://www.luogu.org/problem/T8088 这道题很好想,我想的是维护两个小根堆(当然可以用数组模拟) 然后从堆顶开始,如果两个元素的差小于1,则cnt ...

  5. adblock广告过滤

    1.在 img的 src中 出现 ad连在一起的情况,会被adblock过滤掉. 例如 <img id="adasdd" class="ad_mina" ...

  6. 第十六节:Linq用法大全(四)

    1. OfType 获取集合中中指定类型元素. , , , , , "aaa", "bbb" }; int max = obj.OfType<int> ...

  7. dubbo的dispatcher设置原理

    在上回<Dubbo源代码实现六>中我们已经了解到,对于Dubbo集群中的Provider角色,有IO线程池(默认无界)和业务处理线程池(默认200)两个线程池,所以当业务的并发比较高,或者 ...

  8. 使用maven搭建web项目

    在pom.xml中添加java ee相关的三个依赖包:<scope> jar的有效范围 provided 表示编译期生效,不会打包发布到 tomcat 中 <properties&g ...

  9. Hibernate框架报错:org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.mikey.hibernate.domain.Person.pid

    报错信息 org nate.PropertyAccessException:IllegalArgumentException在调用com.mikey.Hibernate.domain.Person.p ...

  10. HDU 5570:balls 期望。。。。。。。。。。。。。。。

    balls  Accepts: 19  Submissions: 55  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: 65536/655 ...