Java代码生成利器之rapid-generate应用四
来源:互联网 发布:影视剪辑软件 edius7 编辑:程序博客网 时间:2024/05/19 02:24
rapid-generate是基于freemarker编写的,关于freemarker的语法,可以参考官网:http://freemarker.org/ 或者中文手册。常用的一些用法也可以参考:http://www.cnblogs.com/linjiqin/p/3388298.html
对原理感兴趣的同学可以看看源码,如果只是想使用的话,熟悉一下freemarker语法并结合自己项目中的业务,开始写template模板文件吧。
rapid-generate源码中主要的类:
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>
${}可以引用很多变量,这些变量包括:环境变量、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-generate应用四
- Java代码生成利器之rapid-generate应用一
- Java代码生成利器之rapid-generate应用二
- Java代码生成利器之rapid-generate应用三
- Java代码生成利器之rapid-generate应用五
- 代码生成工具 rapid-framework
- rapid-generator JAVA代码生成器
- 代码生成rapid-generator源码分析
- Java 代码生成器 rapid-generator 配置
- Maven自定义插件开发(rapid-generator自动生成代码)
- Lombok — Java代码自动生成 开发利器
- Lombok — Java代码自动生成 开发利器
- Lombok — Java代码自动生成 开发利器
- 代码动态生成利器ASM
- 代码动态生成利器ASM
- 代码动态生成利器ASM
- 代码动态生成利器ASM
- 代码动态生成利器ASM
- RMI、Hessian、Burlap、Httpinvoker、WebService的比较
- nefu 628大组合数取模
- IM OpenSource软件评测报告
- 验证码过期(小功能)
- JavaScript盲点总结
- Java代码生成利器之rapid-generate应用四
- 黑马程序员——Java基础--- 异常
- 欢迎使用CSDN-markdown编辑器
- 【DIRECTX状态详解】
- cancelling 'com.example.myfirstapp.mainactivity activity launch'
- 悲催
- [LeetCode] 012. Integer to Roman (Medium) (C++/Java/Python)
- Itween Stop
- dddd