Tao

Tao obeys its own inherent Nature

基于JavaScript的代码自动生成工具

JavaScript Based Code Generator - codegen

工具主页

http://thelei.sourceforge.net

目的

快速生成程序代码, 比如Struts, Spring, Jdbc/Hibernate所有前后台的代码.

简单介绍

本工具生成代码的思想是读取数据库中表的结构, 使用JavaScript作为脚本语言编写模板, 生成各种代码或者文件, 支持各种格式的文本文件, Java, C#, PHP 等, 只要是文本文件, 都可以生成, 因为生成什么是由你完全自己定义的. 对数据库的访问是通过插件的形式进行的, 所以易于扩充, 目前支持Mysql, 以及支持Ado连接的数据库. 

本工具开发于2006年, 经过两年的内部使用, 进行了不断改进, 现在把它公布出来, 希望能有更多的人用它, 提意见, 然后把它做的更好.

什么时候用它

有时候在项目开发过程中有大量的简单重复劳动, 以Struts, Spring, Jdbc/Hibernate为例, 对数据库中的每张表, 都有其相对应的Dao(2), Service(2), Action(Class+Validation2), Jsp(list+edit+add=3), 需要新建10多个文件/目录,  而这个过程是很枯燥的, 但又会花不少时间, 这个工具的最初开发目的就是自动生成这些文件. 这样,新增一个列表,增删改的模块, 如果不考虑界面需要调整, 就只需要几分钟的时间, 换句话说, 你可以在很短的时间内把所有需要的表自动生成列表,增删改的功能.

为什么用它

答案很简单, 因为这个程序简单容易使用, 而且完全自定义, 能满足不同项目对代码的要求, 只要你能描述出要生成的代码结构和形式的共性,就能把模板写出来.

简单的例子

public class Base<%=getDomainByTable(sys_table_name)%>{

<$

for (var i=0; i<sys_fields.length; i++)

{

var type = getJavaBeanType(sys_fields[i].type);$>

private <%=type%> <%=sys_fields[i].name%>;

<$

}



for (var i=0; i<sys_fields.length; i++)

{

var type = getJavaBeanType(sys_fields[i].type);

$>

public <%=type%> get<%=formatFieldName(sys_fields[i].name)%>(){

return <%=sys_fields[i].name%>;

}

public void set<%=formatFieldName(sys_fields[i].name)%> (<%=type%> <%=sys_fields[i].name%>){

this.<%=sys_fields[i].name%> = <%=sys_fields[i].name%>;

}

<$

}

$>

}
如果当前的表名是:Role, 同时它有role_id int, role_name varchar, description varchar等字段, 那么生成的结果就是:

public class BaseRole{

private int role_id;

private String role_name;

private String description;



public int getRoleId(){

return role_id;

}

public void setRoleId (int role_id){

this.role_id = role_id;

}

public String getRoleName(){

return role_name;

}

public void setRoleName (String role_name){

this.role_name = role_name;

}

public String getDescription(){

return description;

}

public void setDescription (String description){

this.description = description;

}

}
从模板里可以看到, 要生成什么样的代码都是自己可以定制的, 包括方法的起名, 例子里formatFieldName是自己写的JavaScript 方法.

脚本块

  1. <$
          //Javascript code like: println(sys_fields[0].name);
    $> 执行一段代码
  2. <$=sys_fields[0].name$> 显示表达式的值

预定义的变量

  1. sys_table_name: 当前表名
  2. sys_fields: 当前表的Field 对象数组. 使用sys_fields.length 来获取字段的数目.
  3. sys_keys: 当前表主键的数组, 使用sys_keys.length来获取主键字段的数量.
  4. sys_user_name: 当前连接数据库的用户名
  5. sys_db_name: 当前连接到数据库的名字
  6. sys_output: 内部使用,存储生成的中间JavaScript代码
  7. Field 对象属性, 如果有一个字段: user_name varchar(100) not null default 'user', 下面是Field的属性和值:
        name: 字段名, String. 如: sys_fields[i].name, 例子值是 user_name
        type: 字段类型, String, 如: sys_fields[i].type, 例子值是 varchar
        size: 字段长度, integer, 如: sys_fields[i].size, 例子值是 100
        scale: 精度, integer, 如: sys_fields[i].scale, 本例子是varchar 类型,本项为空
        default_value: 默认值, String. 如: sys_fields[i].default_value, 例子值是 user
        is_null: 是否可以为空, boolean. 如: sys_fields[i].is_null, 例子值是 false
        is_primary_key: 是否是主键, boolean. 如: sys_fields[i].is_primary_key, 例子值是 false.

预定义的方法

  1. print(str). 输出str, 没有换行 
  2. println(str). 输出str, 结尾换行
  3. getFieldList(). 返回字段列表, 用',' 分割
  4. 一些其他的javascript 方法, 如capitalize, lowercase, uppercase, trim等等. 你也可以通过Tools/Edit public functions增加自己常用的方法

使用步骤

  1. 创建一个新项目, 设定数据库连接参数
  2. 添加目录和模板, 模板采用JavaScript脚本语言, 唯一的区别是用<$ you code$> 把代码包起来, 或者用<%=expression%> 来打印一个表达式
  3. 生成文件, 分为三种方式: 生成文件, 生成项目中的所有文件, 批量生成(多表, 多模板)

数据库连接参数

  1. 选择数据库类型
  2. 输入需要的信息, 如host, port, username, password and database name

生成文件

  1. 生成当前文件, Template/Generate current file
  2. 生成项目的所有文件, Project/Generate Project Files
  3. 批量生成, Project/Batch Generate, 然后选择需要生成文件的tables和 templates(folders) 生成文件.

Tips

  1. 使用JavaScript map, 而不是if ... else ..., 这样代码看着非常简洁
    <$

    var type_defaultvalue={

    'int':'0',

    'tinyint':'false',

    'varchar':'""',

    'datetime':'new Date()',

    };



    for (var i=0; i<sys_fields.length; i++)

    {

    var type = sys_fields[i].type;



    if(undef(type_defaultvalue[type])){

    println("Undefined default value for field type: '"+ type+"'");

    }



    //the following line has the same result
    //println(sys_table_name+".set"+formatFieldName(sys_fields[i].name)+"("+type_defaultvalue[type] + ");");
    $>
    <%=sys_table_name%>.set<%=formatFieldName(sys_fields[i].name)%>(<%=type_defaultvalue[type] %>);
    <$
    }
    $>
  2. 在项目属性对话框中写一些项目使用的JavaScript方法, 然后可以为不同的表生成不同的模块, 如:
    function getModule(tablename){
         if(tablename.startsWith('user')){
             return "user/";
        }
        //code to return other module name
        //...
        return "";
    }
    然后设置目录或模板的destination path为: <%=getModule(sys_table_name)%><%=getDomainByTable(sys_table_name)%>Action.java, 如果当前的表是user, 目标路径将是: user/UserAction.java, 如果表名是 log, 目标路径将是: LogAction.java

改进这个工具:

如果有下面的问题, 请和我联系:

  1. 需要一个新的数据库插件或者你写了一个新的数据库插件
  2. 不知道如何使用这个工具
  3. 发现了Bug
  4. 其他任意的建议...

 

最后希望这个工具对你能够有所帮助, 同时减少编码时Copy&Paste的时间

posted on 2008-03-05 13:28 wade 阅读(4134) 评论(18)  编辑  收藏 所属分类: C++Java

评论

# re: 基于JavaScript的代码自动生成工具 2008-03-06 08:50 ivin

不错,不错啊,非常的实用,而且是用js写的,也没什么环境的要求。浏览器即可,以前自己也写过这样的工具用于处理重复的劳动。  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具[未登录] 2008-03-06 09:03 wade

是C++写的, 用户使用Javascript来编写模板, 需要下载, 解压后即可运行.  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-03-06 19:25 WLR

很好,很强大,支持
by http://www.vifir.com/?refer=blogjava_programmer  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-03-07 11:46 rocket

不错的方法。
是根据已知表结构的情况下进行代码生成。
属于模板方式生成代码技术。
其实业内常用的模板方式生成代码的方法是xdoclet和annotation,使用注释来提取模板元素,再使用其它的模板框架(比如velocity)来生成代码。
如果作者是这个代码生成工具的维护者,希望能再多借鉴一些代码生成技术,毕竟用js生成代码的创意很好。  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-03-07 13:01 wade

@rocket
最初设计这个工具的时候, 有如下考虑:
1. 跨平台(C++, Java, PHP)
2. 最终要下载或安装的文件要小, 不能有太多的依赖库, 那样可能让用户失去信心(C++, PHP)
3. 界面要简单, (C++)
4. 使用常用的脚本语言, 不增加对用户的要求(Javascript)

于是, 排除了c#, java, 个人觉得xdoclet和annotation不是很直观, 可能适合企业中批量的生成代码, 但上手会有一定的难度.

所以最终选择了 c++来开发, 使用javascript作为脚本语言, 目前下载文件5M左右, 缺点就是对数据库的支持需要一个一个添加

如果您有什么改进这个工具的想法, 请和我联系.
最后感谢您的建议, 我会参考一些其他工具的做法的.
  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-03-13 22:03 wade

新增了如下内容:
1. 通过Ado连接各种数据库的支持.测试了SQL Server, 感觉速度比mysql直接连要慢, Access的MDB很快。
2. 支持批量生成部分/全部模板, 保存选中的模板到Working Set(Eclipse里的名字),用来保存当前选中的目录和模板  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具[未登录] 2008-05-20 13:18 roger

有没有办法通过附加表名来获取字段的方法,比如当前表table1的字段获取通过sys_fields[i].name,当前表名sys_table_name,如果在同一个模板中此时我希望获取table2的字段,我应该怎么做呢?  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-05-27 11:19 wade

@roger
目前还不支持,我已经把这一点记下来了,下一个版本会加上去,谢谢  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-06-16 18:28 路过

这个好像和你这个差不多,但凭借java可能功能更强大。
Any-java代码自动生成工具(java模板语言)发布
一、Any-java代码自动生成工具(java模板语言)简介
简单说明:
模板解释性语言,在模板中没有特殊标记的部分,原封不动输出,
标记的部分允许所有的java语法,并解释执行。
用途:代码自动生成
比如:开发完了一个类文件,但还有很多类似的类要做,只是要改变一些个别的地方,
那么,可以把需要改动的地方用java变量标记,然后运行该模板,自动生成多个类。
同时,我们也提供了一些工具类(比如excel读取),则设计书和模板联动,可以大大提高开发速度。
当然,如果没有设计书,也可以直接读取DB的表结构来自动生成代码。

该工具不同与某些java代码自动生成的工具,规定死了模板,只能生成指定的代码,
思路是:把先开发出来的java类,作简单的变量替换,就生成新的模板,从而生成新的java类。
也不只限于java类,任何重复的代码部分都可以做成模板。

起名为“any"的理由
1。简单:只要懂java任何人都可以在2小时内学会。 anyone can use it easily.
2。灵活:任何文件都可以轻易的转化为模板。 anything is template.
3。强大:几乎能实现你所有想自动化的部分,只要你有灵感。anything is real.
  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2008-09-09 08:10 aiya

您的函数不能够返回中文,这是否是一个bug?  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2009-04-14 10:31 wade

@aiya
已经在最新版本(V 1.1.20081228)中修好了,谢谢  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2009-04-14 10:32 wade

@roger
已经在最新版本(V 1.1.20081228)中修好了,
通过db.getTable('your_table_name') 获取任何一张表的内容.
谢谢  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具[未登录] 2009-08-23 20:26 tin555

不知道为什么..我用ADO连接ORACLE...界面上生成慢到爆.非常非常的慢..是这个软件本身很慢???  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具[未登录] 2009-08-23 20:28 tin555

操作上很慢.....

关注中......
我的邮箱:tin555.d@gmail.com  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2009-10-20 17:14 aiya

getcomment能否支持oracle
您现在只有Mysql和ado的插件,oracle得不到comment  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2009-10-21 09:49 wade

@aiya
我目前正在整理程序结构,增加缓存, 因为根据 tin555的意见, ado连接oracle特别慢, 增加完缓存后我会把oracle的comment获取出来, 但可能需要一两个月的时间

@tin555
可能需要一两个月的时间,我会调整程序结构,通过缓存数据库信息, 提高速度, 软件本身速度不慢,但每次都要访问数据库比较慢  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具[未登录] 2010-05-27 00:03 愚公

功能多,设置多,没有中文文档,用起来不容易。  回复  更多评论   

# re: 基于JavaScript的代码自动生成工具 2010-07-19 17:58 pyd

希望能加上表之间的关系关联,这样会更完善  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(7)

随笔分类

随笔档案

相册

Photo

搜索

最新评论

阅读排行榜

评论排行榜