告别无止境的增删改查--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

时间: 2024-10-29 01:39:43

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

java 数组的增删改查,用数组的方法实现

问题描述 java 数组的增删改查,用数组的方法实现 对一维数组进行增删该查:int[] num=new int[10]要求:用方法实现1输入10个整数存入数组2删除指定位置上的数3修改指定位置上的数4查找某个数的位置(下标)5查找最大值6查找最小值7去掉一个最大值和一个最小值,求平均值. 跪求各位大神能给小弟一个立案...好人一生平安!! 解决方案 http://blog.csdn.net/myoral/article/details/7445675 解决方案二: java 对象数组(增删改查

java对xml节点属性的增删改查实现方法_java

学习本文之前请先看我的另一篇文章JAVA对XML节点的操作可以对XML操作有更好的了解. package vastsum; import java.io.File; import java.io.FileWriter; import java.util.Iterator; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; i

java-Java对owl文件的解析和增删改查该如何实现?

问题描述 Java对owl文件的解析和增删改查该如何实现? 最近在做一个项目,我们构建本体之前一直用protege这个软件,构建出来的.owl文件格式是固定的,于是乎项目经理的意思是我们自己对.owl文件进行修改就好没必要非得依赖这个protege(原因就是生成的格式是固定的).但是想对这个.owl文件进行修改就得解析出里面的类,概念,对象属性,数据属性等内容,我想问,有哪个大神做过这方面的工作,给点建议或者方法啥的参考下.或者类似的对.owl文件的增删改查的方法提供参考参考.小弟不胜感激呀!

treeview-MFC中 解析XML文件,并用tree control 显示,如何进行对xml文件的增删改查?

问题描述 MFC中 解析XML文件,并用tree control 显示,如何进行对xml文件的增删改查? 如题,我利用tree control 显示了一个xml文件,然而不知道如何进行修改数据,就是点击了树形结构的节点,但是不知道如何定位点击的节点位置在原xml文件的位置? 解决方案 http://www.codeproject.com/Articles/11244/XML-TreeView-Control 解决方案二: simpleXML怎样解析一个xml文件,并对xml进行增删改查 过程Li

Java通过JDBC进行简单的增删改查MySQL数据库

JDBC基本操作   下面的所有方法和数据成员都在public class JDBCOperation内部. (1)定义记录的类(可选) 这样做主要是为了便于操作和接口定义,是非必须的. static class Student {         private String Id;         private String Name;         private String Sex;         private String Age;           Student(Str

java连接mysql数据库配置及增删改查操作记录

一.软件下载 直接到MySQL官网下载以下两个工具:mysql-5.1.32-win32.msi.mysql-gui-tools-5.0-r17-win32.msi 前者是MySQL的安装文件,后者是MySQL Tool安装文件,包括JDBC. 二.环境配置 把mysql-connector-java-5.0.4-bin.jar从MySQL\MySQL Tools for 5.0\java\lib拷贝到D:\Tomcat 6.0\lib下,然后在classpath里面加入D:\Tomcat 6.

java web实现增删改查后,应该学习哪些高级技术?

问题描述 java web实现增删改查后,应该学习哪些高级技术? 做了个小项目,实现了curd,想继续往缓存,并发,负载高级深入,请推荐一个详细的高级技术路线?最好有书 解决方案 javaweb深入浅出,不过这个方向研究,主要还是在公司里学的会更实用些 解决方案二: 多线程,Socket,I/O JSP.EL.JSTL,AJAX JavaScript,jQuery JSON,XML EJB(可忽略) 各种框架 ......太多了 解决方案三: 多线程,Socket,I/O JSP.EL.JSTL

新手 基础-用java在用户的增删改查中遇到的问题

问题描述 用java在用户的增删改查中遇到的问题 final static String的意义try{}catch的用法Connection conn = DriverManager.getConnection的意义关于这一段boolean用法的正确与否public boolean addUser(User newUser){ boolean flag=false; String addUserSQL=""INSERT INTO Users(UserNamePassword) VALU

HDFS Java代码进行增删改查

提醒:如果要在idear或者eclipse等IDE下运行就必须在HDFS上给你所使用的目录分配权限给windows下的用户,为了方便起见建议给所有权限777 创建目录命令 hdfs dfs -mkdir myproject 分配权限命令 hdfs dfs -chmod 777 myproject HDFS增删改查工具类 package hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Fi