http://blog.csdn.net/aaa1117a8w5s6d/article/details/8255961
有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘贴复制,顿时脑后升起一阵凉风。于是想到个找或者写一个Java代码的生成器,这样在正常开发进度下,也能余下更多的时间去做些别的事情。
闲话少说,首先总结下需求:
我需要的这个工具能够读取数据库表结构,通过对字段类型、名称等分析得到需要的各种变量,根据模板生成相应的pojo类、hibernate的xml配置文件、dao和service的接口和类。
需求看起来很简单,但是一是没搞过这样的小工具,二是技术不过关,所以还是想到了找找有没有开源的代码拿过来根据自己的需求改。
于是找到了rapid-generator这个开源工具,同学们可以下载rapid-generator直接使用,根据自己的需求写好模板就行了。
由于自己项目中的特殊情况和公司规范等因素,另外也是想学习下别人的设计,所以我对源码进行了删减和功能的修改。
来看下主要的类:
Table:根据表结构建立的对象。
Column:根据表中每列建立的对象。
Generator:生成器核心类,主要负责根据表对象和读取FreeMarker模板生成最后的java代码文件。
GeneratorControl:控制生成过程等的一些参数,例如文件是否覆盖、文件编码等。
GeneratorProperties:读取配置文件的类,配置文件包括数据库连接信息和一些基本的参数配置。
下面来看一下模板的编写:
pojo模板:
- <#include "/java_copyright.include">
- <#assign className = table.className>
- <#assign classNameLower = className?uncap_first>
- package ${basepackage}.pojo.${mpackage}.${table.classNameFirstLower};
- <#include "/java_imports.include">
- import com.linkage.agri.pojo.base.BaseEntity;
- public class ${className} extends BaseEntity {
- private static final long serialVersionUID = 5454155825314635342L;
- <#list table.columns as column>
- /**
- * ${column.remarks}
- */
- private ${column.simpleJavaType} ${column.columnNameLower};
- </#list>
- <@generateJavaColumns/>
- <#macro generateJavaColumns>
- <#list table.columns as column>
- <#if column.isDateTimeColumn>
- public String get${column.columnName}String() {
- return DateConvertUtils.format(get${column.columnName}(), FORMAT_${column.constantName});
- }
- public void set${column.columnName}String(String ${column.columnNameLower}) {
- set${column.columnName}(DateConvertUtils.parse(${column.columnNameLower}, FORMAT_${column.constantName},${column.simpleJavaType}.class));
- }
- </#if>
- public void set${column.columnName}(${column.simpleJavaType} ${column.columnNameLower}) {
- this.${column.columnNameLower} = ${column.columnNameLower};
- }
- public ${column.simpleJavaType} get${column.columnName}() {
- return this.${column.columnNameLower};
- }
- </#list>
- </#macro>
FreeMarker的基本语法可以看下FreeMarker中文手册。
${}可以引用很多变量,这些变量包括:环境变量、table对象、配置变量等,这些变量都装在一个map里,如果自己有特殊需求,当然可以修改源码来装载更多的变量值。
注意:当变量为对象时,访问对象的属性是通过get方法来访问的。例如${table.classNameFirstLower},是引用 table对象的getNameFirstLower()方法,即使table对象中没有nameFirstLower这个属性也能够引用。
再看下我写的dao的模板:
- <#include "/java_copyright.include">
- <#assign className = table.className>
- <#assign classNameLower = className?uncap_first>
- package ${basepackage}.dao.${mpackage}.${table.classNameFirstLower};
- import java.math.BigDecimal;
- import java.util.List;
- import java.util.Map;
- import com.linkage.agri.dao.base.AbstractHibernateDAO;
- import com.linkage.agri.exception.DAOException;
- import ${basepackage}.pojo.${mpackage}.${classNameLower}.${className};
- <#include "/java_imports.include">
- public Class ${className}DAOImpl extends AbstractHibernateDAO implements ${className}DAO
- {
- /**
- * <query all>
- * @param paramMap
- * @param orderMap
- * @param pageNum
- * @param pageSize
- * @return
- * @throws DAOException
- */
- @SuppressWarnings
- public List<${className}> queryList${className}ByAttr(Map<String, Object> paramMap, Map<String, String> orderMap, int pageNum,
- int pageSize)
- throws DAOException
- {
- return super.listInstances(${className}.class, paramMap, orderMap, pageNum, pageSize);
- }
- /**
- *
- * <find one by id>
- * @param serial
- * @throws DAOException
- */
- public ${className} find${className}By${table.pkColumn.columnName}(${table.pkColumn.simpleJavaType} ${table.pkColumn.columnNameFirstLower})
- throws DAOException
- {
- return (${className})super.findById(${className}.class, ${table.pkColumn.columnNameFirstLower});
- }
- /**
- *
- * <save one>
- * @param ${table.classNameFirstLower}
- * @throws DAOException
- */
- public ${table.pkColumn.simpleJavaType} save${className}(${className} ${table.classNameFirstLower})
- throws DAOException
- {
- return (${table.pkColumn.simpleJavaType})super.saveInstance(${table.classNameFirstLower});
- }
- /**
- *
- * <update one>
- * @param ${table.classNameFirstLower}
- * @throws DAOException
- */
- public void update${className}(${className} ${table.classNameFirstLower})
- throws DAOException
- {
- super.updateInstance(${className});
- }
- /**
- * <check one is have?>
- * @param paramMap
- * @return
- * @throws DAOException
- */
- public boolean check${className}IsHaveByAttr(Map<String, Object> paramMap)
- throws DAOException
- {
- StringBuffer sqlBuffer = new StringBuffer();
- sqlBuffer.append("SELECT COUNT(*) FROM ${table.sqlName} T ");
- sqlBuffer.append("WHERE T.${table.pkColumn.sqlName} = ? ");
- BigDecimal big = (BigDecimal)super.findUniqueResultBySQLWithParams(sqlBuffer.toString(), paramMap.get("${table.pkColumn.columnNameFirstLower}"));
- return big.intValue() > 0 ? false : true;
- }
- /**
- * <update some>
- * @param ${table.classNameFirstLower}List
- * @return
- * @throws DAOException
- */
- public void update${className}Batch(List<${className}> ${table.classNameFirstLower}List)
- throws DAOException
- {
- super.updateBatchInstance(${table.classNameFirstLower}List);
- }
- /**
- *
- * <delete one>
- * @param ${table.classNameFirstLower}
- * @throws DAOException
- */
- public void delete${className}(${className} ${table.classNameFirstLower})
- throws DAOException
- {
- super.deleteInstance(${table.classNameFirstLower});
- }
- }
建立模板是能否解决自己问题的关键,在摸索出门道以后写模板变的十分简单。其实原理很简单,就是用一系列占位符来替换实际的变量值。
模板路径可以按照实际项目中的路径来拜访,生成器可以读取某个路径下所有模板进行生成,结果如下图:
接口和实现:
就说这么多吧,感兴趣的可以研究下这个工具的源码,也DIY出一套自己代码生成工具。不感兴趣的直接写模板就能用。
相关推荐
"最快速的Java代码生成器 Rapid-Generator"是一款专为Java开发者设计的高效工具,旨在提升开发效率,减少手动编写重复代码的工作量。这款工具以其快速、灵活和强大的自定义能力在Java开发社区中受到广泛关注。 ...
Rapid-Generator v3.9 正是这样一款高效能的代码生成器,专为Java开发者设计,特别是那些使用诸如iBatis、iBatis3、Hibernate、Spring MVC和Struts2等框架的开发者。这款独立版的代码生成器使得开发者可以将精力集中...
"最快速的Java代码生成器Rapid-Generator"是一款高效能的工具,旨在为开发者提供便捷的Java框架代码自动生成服务。它通过自动化的方式减少了手动编写重复性代码的工作量,提高了开发效率,使得开发者能够更专注于...
"基于Java的实例源码-最快速的Java代码生成器 rapid-generator.zip" 提供了一种高效的解决方案,名为Rapid-Generator。这个工具以其速度和灵活性而受到开发者们的青睐。 1. **Rapid-Generator简介** Rapid-...
【标题】"基于Java的开发源码-最快速的Java代码生成器 rapid-generator.zip" 提供的是一个名为 "rapid-generator" 的工具,该工具专为Java开发者设计,旨在加速开发过程,通过自动化代码生成来提高效率。这个工具的...
《Java编程:快速代码生成器Rapid-Generator详解》 在Java开发中,代码生成器是一种提高效率的重要工具,它能够自动生成大量的基础代码,使开发者可以专注于业务逻辑的实现,而非重复的手动编码工作。"Rapid-...
《Java源码:快速代码生成器Rapid-Generator详解》 在编程领域,代码生成器是一种提高开发效率的重要工具,它能自动生成大量的基础代码,让开发者能够专注于业务逻辑的实现,而非重复性的编码工作。 Rapid-...
"rapid-generator"是这样一个基于Java的高效代码生成器,其版本号为3.9.1,发布日期为2010年7月10日。这个工具的主要目标是帮助开发者快速生成符合业务需求的高质量代码,从而让开发者能够专注于更重要的逻辑设计和...
"Rapid-Generator"是一款强大的代码生成工具,它能够帮助开发者快速、高效地自动生成符合特定规范的源代码,从而节省编程时间,提高开发效率。这个工具的核心在于其配置和模板系统,允许用户根据自己的需求定制化...
"rapid-generator-3.9.2.20100720"这个版本的代码生成器,特别适用于Java Web开发中的MVC架构,即Model-View-Controller模式。在MVC模式下,Service层处理业务逻辑,DAO层负责数据操作,而Mapper则作为ORM(对象关系...
rapid-generator是一个生成器引擎,让你可以专注与代码生成器模板的编写, 可以生成如ibatis,ibatis3,hibernate,spring_mvc,struts2等等代码. 该项目是 Rapid Framework 框架的一部分。
JAVA源码最快速的java代码生成器rapid-generator
易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,并且鼓励你修改代码,也可以作为任何语言的代码生成器 配置简单,只有一个配置文件generator.properties 生成器的运行 在eclipse中运行 配置...
java资源最快速的java代码生成器 rapid-generator提取方式是百度网盘分享地址
读取数据库表结构,通过对字段类型、名称等分析得到需要的各种变量,根据模板生成相应的pojo类、hibernate的xml配置文件、dao和service的接口和类. 工程可以直接使用 在config文件夹下的 generator.xml里配置数据库...
代码生成器模板可以引用的相关变量 1. g.generateByTable("table_name") 方法可以引用的变量 table : cn.org.rapid_framework.generator.provider.db.model.Table 2. g.generateByClass("class") 方法可以引用的变量...
"Rapid Generator"作为基于Java的代码生成器,其核心设计目标就是提供快速、高效的代码自动化生成能力。在这款3.9.1.20100710版本的压缩包中,我们可能会找到以下关键知识点: 1. **元数据驱动开发**:Rapid ...
半自动化Java代码生成器[利用freemarker模板生成] 本项目Github地址: 项目最初来自于 增加一些定制和扩展, 修改为基于MAVEN的格式。 整体架构保持不变。 增加的特性为: 支持表名前缀去除,参考配置文件中的 ...
"my-rapid-generator.zip" 提供了解决这一问题的有效工具,它是一个代码生成器,能够在连接到数据库后自动生成对应三层的代码,极大地提升了程序员的工作效率。 这个工具的核心功能是动态生成代码,减少了手动编写...