有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘贴复制,顿时脑后升起一阵凉风。于是想到个找或者写一个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出一套自己代码生成工具。不感兴趣的直接写模板就能用。
我只是走在路上,偶尔驻足观赏,偶尔回头看看。
原文链接:http://www.cnblogs.com/zhuYears/archive/2012/02/29/2373491.html
相关推荐
"Java学习路线图:Java应知应会的300个问题.rar"这个压缩包文件,很可能包含了从基础到高级的Java知识点,旨在帮助你构建一个全面的学习路径。 首先,我们来讨论Java的基础部分。这通常包括Java语法、数据类型、...
《贪婪的大脑:为何人类会无止境地寻求意义》是由丹尼尔·博尔所著的一本关于意识科学和心理学的书籍。该书受到了脑科学研究专家唐孝威院士和意识领域知名学者浙江大学李恒威教授的高度评价,并被2012年《华尔街时报...
梦想无止境 北斗无止境
医美产业链深度剖析:变美,无止境.pdf
内置emmet:tab一下生成一串代码 无死角提示:除了语法,还能提示ID、Class、图片、链接、字体… 跳转助手、选择助手,不用鼠标,手不离键盘 多种语言支持:php、jsp、ruby、python、nodejs等web语言,less、coffee...
数据驱动的无止境学习问答系统是现代人工智能发展的一个重要方向,它旨在构建能够持续学习和改进的智能问答系统。这些系统通常以大规模数据集为基础,通过不断学习新知识和理解新情境,来提高其在开放领域问答中的...
数据库操作方面,SQL语言是基础,包括DML(增删改查)、DDL(数据定义)、DCL(权限控制)等,理解JDBC API的使用,以及事务的ACID特性。如果涉及到框架,如Spring,还需要了解其AOP(面向切面编程)和IOC(依赖注入...
只要创意无限,Skype4Java的应用场景就无止境。 5. **开发注意事项** 在实际开发过程中,需要注意的是,Skype4Java依赖于本地安装的Skype客户端,因此,用户的操作系统必须支持Skype,并且客户端必须运行才能使用...
5. 强大的可扩展性:JavaScript的创意应用无止境,开发者可以根据需求创建各种功能。 Java与JavaScript的区别: 1. 类型不同:Java是编译型语言,通常用于开发Applet,而JavaScript是解释型脚本语言,用于网页。 2....
Hack Endless [黑无止境].rarHack Endless [黑无止境].rarHack Endless [黑无止境].rarHack Endless [黑无止境].rar
它支持跨平台特性,这意味着可以在不同的操作系统上使用相同的Java代码调用特定的本地库。 - **使用步骤**: 1. **编写Java类**:创建一个Java类,用于声明DLL库中对外提供的函数。这些函数需声明为`native`关键字...
HBuilder是一个最快的前端开发工具,它包含了代码输入法的创新、代码块的优化、emmet的集成、快捷键语法设计、无鼠标操作。。。让手爽,飞一般的编码编码比其他工具快5倍够不够?对极客而言,追求快,没有止境!代码...
《黑无止境Hackendless》是一本深入探讨网络安全的电子书,主要关注黑客技术和相关的编程知识。这本书以.chm(MicrosoftCompiled HTML Help)格式提供,这是一种常见的电子文档格式,便于用户阅读和检索内容。书中的...
华熙生物作为全球透明质酸钠全产业链布局的龙头企业,自2000年开始透明质酸钠的商业化,经过多年的发展和研发,已经形成了从原料生产到医疗终端、化妆品及食品应用的全产业链布局。企业依托强大的研发能力和创新技术...
Java:trade_mark:3D开源游戏引擎。目标我开发此游戏引擎的目的是使游戏引擎充满功能和技术,同时仍非常易于开发游戏。引擎盖下该引擎使用来处理图形和音频,并被设计为可扩展,模块化和面向未来。特征Polygame仍在...
20210624-中信建投-医美行业:美无止境,拥抱产品创新大时代.pdf
销售团队个性工作总结报告ppt模板,目录:沿途风光、身旁有你、驻足凝望、正在路上,宽阔通往远方的道路大图封面,简约扁平化设计,销售工作回顾、销售总览、目标达成、载誉而归、团队介绍、团队优势,适合销售工作...
以上只是"学习Java"这个主题的一小部分内容,实际上Java的学习是无止境的,随着技术的更新和发展,Java的生态系统也在不断扩展,包括框架(如Spring、Hibernate)、工具(如Maven、Gradle)以及新的语言特性等。...