Dorado5-CodeGen

Dorado5-CodeGen为Dorado5开发服务的代码生成器,旨在通过简单配置,自动生成好项目开发中所需的大部分代码,并输出到固定目录中,再从固定目录里面将代码拷贝进项目工程中,这样既节省人力避免写大量的CRUD方法和相关配置文件,又防止自动生成的代码直接输出到项目中覆盖已有的功能。
只要配置好需要自动生成功能表名称,并在数据库中写好相关注释,再配置好需要生成代码的模板,就可以从spring配置文件,到DAO再到Service层,最后到ViewModel层的xml文件全部自动生成好,这种技术对于开发模式固定的项目,能够节约大量的人力,并且对于提高代码规范性降低bug率,有一定作用,同时对项目管理层面来看也有正面效果。
此代码生成器的默认模板是基于D6开发框架下JDBC开发模式,此模式比较简单,开发速度较快。然而目前很多公司都是基于hibernate持久层,只要将模板略微改动下,就可以适应大多数项目。此代码生成器项目基于国内的一个开源项目rapid-generator以及国外的freemark。
rapid-generator主页地址为: http://code.google.com/p/rapid-generator/
授权许可为:Apache License 2.0
freemark为java开源模板引擎,主页地址为: http://freemarker.sourceforge.net
授权许可为:BSD-style License

核心理念

Dorado5-CodeGen基于国内开源代码生成器框架rapid_generator,同时继承其框架的核心理念:
为你生成一切,再根据所需手工copy回工作区
通常代码生成器存在的问题

  • 二次开发困难,没有源码可以修改模板文件的model对象等
  • 过于智能,自动插入我们的项目中,程序员还需考虑旧的代码会不会被覆盖的问题
  • 生成文件的时候让你选要生成那些文件,而rapid只负责生成代码,这样生成器核心一分精简
  • 没有将存放模板的目录名称及文件名称利用起来,导致还需配置每个模板文件生成的文件名,目录结构

解决办法

通过在Dorado5-CodeGen中配置需要生成的相关功能对应的表名,由Dorado5-CodeGen为你生成大部分代码(spring配置文件,DAO层代码,Service层代码,ViewModel配置文件等),由开发人员将代码拷贝入IDE开发工具中,再根据自己的需要加上业务逻辑。

特性

  • 基于FreeMarker模板语言,并且模板易于修改
  • 基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过)
  • 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区
  • 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,并且鼓励你修改代码,也可以作为任何语言的代码生成器
  • 配置简单,只有一个配置文件generator.properties

生成器运行

项目中自带h2数据库引擎以及驱动,先进入项目目录,双击codegen.rarcodegen下的start_h2_db.bat文件,即可启动演示数据库
在eclipse中运行
1. 配置classpath,将generator/lib中的rapid-generator.jar及其它数据库驱动加入classpath
2. 修改generator.xml的数据库连接属性及其它属性

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>
		代码生成器配置文件: 
		1.会为所有的property生成property_dir属性,如pkg=com.company => pkg_dir=com/company
		2.可以引用环境变量: ${env.JAVA_HOME} or System.properties: ${user.home},property之间也可以相互引用
	</comment>
	<!-- java 文件的包路径 -->
	<entry key="basepackage">com.dorado.codegen</entry>
	<!-- jsp 文件的路径 -->
	<entry key="basedirectory">dorado.codegen</entry>
	<!-- dorado中VIEW的 APPID -->
	<entry key="APPID">USER_INFO</entry>
    <!--生成文件路径  -->
	<entry key="outRoot">E:generator-output</entry>
	
	<!-- 需要移除的表名前缀,使用逗号进行分隔多个前缀,示例值: t_,v_ -->
	<entry key="tableRemovePrefixes"></entry>
	
	<entry key="jdbc.username">sa</entry>
	<entry key="jdbc.password">sa</entry>
		
	<!-- oracle需要指定jdbc.schema,并且可能要大写,其它数据库忽略此项配置  -->
	<entry key="jdbc.schema"></entry>
	<entry key="jdbc.catalog"></entry>
	<!-- 数据库连接及驱动 -->
	<entry key="jdbc.url">jdbc:h2:tcp://localhost/test</entry>
	<entry key="jdbc.driver">org.h2.Driver</entry>
	
	<!-- 数据库类型至java类型映射  -->
	<entry key="java_typemapping.java.sql.Timestamp">date</entry>
	<entry key="java_typemapping.java.sql.Date">date</entry>
	<entry key="java_typemapping.java.sql.Time">date</entry>	
	<entry key="java_typemapping.java.lang.Byte">int</entry>
	<entry key="java_typemapping.java.lang.Short">int</entry>
	<entry key="java_typemapping.java.math.BigDecimal">double</entry>
	<entry key="java_typemapping.java.sql.Clob">string</entry>
	
</properties>

3. 以application的方式运行GeneratorMain类,要生成不同的table,直接修改代码即可
package cn.org.rapid_framework.generator;


/**
 * 
 * @author 
 * @email 
 */

public class GeneratorMain {
	/**
	 * 请直接修改以下代码调用不同的方法以执行相关生成任务.
	 */
	public static void main(String[] args) throws Exception {
		GeneratorFacade g = new GeneratorFacade();
//		g.printAllTableNames();				//打印数据库中的表名称
		
		g.deleteOutRootDir();							//删除生成器的输出目录
		g.generateByTable("user_info","template_dorado");	//通过数据库表生成文件,template为模板的根目录
//		g.generateByTable("TB_SHIPBILL","template_dorado");	//通过数据库表生成文件,template为模板的根目录
//		g.generateByTable("TB_PROMISE_PROTOCOL","template");	//通过数据库表生成文件,template为模板的根目录
//		g.generateByAllTable("template");	//自动搜索数据库中的所有表并生成文件,template为模板的根目录
//		g.generateByClass(Blog.class,"template_clazz");
		
//		g.deleteByTable("table_name", "template"); //删除生成的文件

		//打开文件夹
		Runtime.getRuntime().exec("cmd.exe /c start "+GeneratorProperties.getRequiredProperty("outRoot"));
	}
}

说明

由上面代码可见,代码生成器是根据模板生成项目代码文件。那我们通过修改模板,可以使此工具适应绝大多数项目。
项目中提供的样例模板是一个基于spring,jdbc简单架构的dorado单表增删改查的样例,由于是基于特定项目,可能不适合读者的项目,可以考虑修改模板文件,以适应自身项目。
前台ViewModel和jsp文件,界面以单表的增删改查为基础,相关控件自动生成,不需要写一句代码,页面的样式和格式基本固定和统一,页面控件命名全部统一,dataset的中文注释也全部重数据库中反射出来。
后台部分是由BO提供相关服务,由spring注入相关DAO,由于项目的需要,同时提供逻辑删除和物理删除两种方式。
而DAO层继承JdbcTemplateExtend,通过JdbcTemplateExtend对数据库进行持久化操作。而JdbcTemplateExtend 继承spring的 JdbcTemplate,仅仅多提供了一个分页查询的方法,基于篇幅所限,JdbcTemplateExtend源码不再放出。读者可以基于自己的需求自行实现。


基于生成器的开发套路

首先调研后客户需求,完整理解客户要求,设计好数据库,写好字段中文别名,这个是用来提取到dataset中field的label中,在字段较多的dataset中,能大量节约开发时间。
然后基于单表的开发场景,直接生成代码,略作调整即可,假如是复杂的开发场景,可以先生成代码,然后根据需要,将需要的方法和代码粘贴进项目工程中。

扩展

由于代码生成器是基于模板进行代码生成,那么在项目前期,可以通过需求分析后,将共性的业务场景提炼出来,做成业务组件形成业务组件模板,后期在进行项目开发时,可以将增删改查单表维护做成一个业务组件直接生成代码,也可以将树维护或者流程页面做成相关业务组件,编码时只需要根据具体业务组件生成相关代码,然后做逻辑上的微调即可。通过此基于业务组件的代码生成器开发,基本能提高开发效率一倍以上。


问题

此生成器支持绝大多数数据库,主要测试过oracle,mssqlserver,mysql。
mssqlserver存在点问题,无法将中文字段别名放入到dataset的field的label中,所以针对mssqlserver的项目,修改量稍微大点。


感谢

非常感谢rapid-generator的作者badqiu,您提供了这么好的框架
非常感谢济南兰剑物流的刘璐,郭伯克,还有锐道华中事业部的刘冰,感谢你们对dorado代码生成器的贡献和完善


Back to top