告别无止境的增删改查--Java代码生成器

简介: 转自:http://www.cnblogs.com/zhuYears/archive/2012/02/29/2373491.html 告别无止境的增删改查--Java代码生成器     有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘贴复制,顿时脑后升起一阵凉风。

转自:http://www.cnblogs.com/zhuYears/archive/2012/02/29/2373491.html

告别无止境的增删改查--Java代码生成器

 

  有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘贴复制,顿时脑后升起一阵凉风。于是想到个找或者写一个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

目录
相关文章
|
2月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
76 1
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
91 38
|
11天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
35 3
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
55 24
|
19天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
55 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
79 5
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
55 5
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
2月前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
50 5
Java反射机制:解锁代码的无限可能
|
2月前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
50 5