zoukankan      html  css  js  c++  java
  • 告别无止境的增删改查--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

  • 相关阅读:
    FTPUtil工具类
    maven配置默认jdk版本
    IDEA 使用lombok
    当前时间是否在区间范围内
    获取剩余的秒数
    java类执行顺序
    java8 关于Set集合的线程安全使用
    反射之设置对象字段值以及根据字段获取对象字段值
    ES方法使用注意
    java导出标题多行且合并单元格的EXCEL
  • 原文地址:https://www.cnblogs.com/ae6623/p/4416374.html
Copyright © 2011-2022 走看看