Java代码生成利器之rapid-generate应用四

  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出一套自己代码生成工具。不感兴趣的直接写模板就能用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值