阅读更多

29顶
0踩

编程语言

转载新闻 基于JavaScript的代码自动生成工具

2008-03-06 09:01 by 见习编辑 jejwe 评论(26) 有42260人浏览

JavaScript Based Code Generator - codegen

工具主页

http://sourceforge.net/projects/jbcgen/

目的

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

简单介绍

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

本工具开发于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的时间

来自: blogjava
29
0
评论 共 26 条 请登录后发表评论
26 楼 drager 2011-12-07 15:14
发现在的时间晚了,要是早三年就好了
25 楼 kelongsoft 2011-11-25 14:54
  
24 楼 dave99 2010-10-11 10:40
支持一下
23 楼 fansunday 2010-10-05 10:54
能把  SqlServer 的插件或者oracle的插件给个
谢谢! (1014508050@qq.com)
22 楼 JavaLanguageFun 2010-08-21 01:49
好像比较有用 ,有时间下载下来看看。
21 楼 自由人-阿星 2010-06-29 14:59
  • 苦吃建这么多
[img][/img][url][/url][flash=200,200][/flash]     
20 楼 cuixiping 2010-05-26 23:50
没有中文文档,我实在用不来
19 楼 fengzi2009F 2010-05-08 09:03
哈哈
试试啊
18 楼 zhouming4455 2010-05-07 17:51
谢谢!190826329@qq.com
17 楼 jejwe 2010-01-08 11:14
chailinglu 写道
这个工具哪有。能不能麻烦给我发一份。
谢谢。
chailinglu_java@163.com

不仔细看文章啊。开头不就是吗!
16 楼 chailinglu 2010-01-08 10:36
这个工具哪有。能不能麻烦给我发一份。
谢谢。
chailinglu_java@163.com
15 楼 pm6422 2009-12-17 23:38
可否给个oracle插件,谢谢(email:pm6422@126.com)
14 楼 cmy285 2009-08-19 10:54
create or replace trigger ttig
after insert
on emp for each row
begin
  update emp set times=sysdate;
end;


这个触发器为什么报下面的错误?
[color=red]ORA-04091: 表 CMY.EMP 发生了变化,触发器/函数不能读
ORA-06512: 在"CMY.TTIG", line 2
ORA-04088: 触发器 'CMY.TTIG' 执行过程中出错
[/color]
13 楼 cmy285 2009-08-19 10:53
create or replace trigger ttig
after insert
on emp for each row
begin
  update emp set times=sysdate;
end;


这个触发器有什么错误?
12 楼 xxoo1212 2009-08-08 12:27
这个正式我一直想做的事 可是由于工作太忙 有没有合适的合作伙伴 一直都没有弄
很佩服大哥你居然已经弄出来了 一定要好好学习一下
11 楼 glacier3 2009-05-15 09:30
对数据库中的每张表, 都有其相对应的Dao(2), Service(2), Action(Class+Validation2), Jsp(list+edit+add=3), 需要新建10多个文件/目录,  而这个过程是很枯燥的, 但又会花不少时间,

--------------既然知道这么麻烦,为什么还要自讨苦吃建这么多类?!
10 楼 pengpeng231 2009-04-09 02:15
java.util.Date()
9 楼 itanger 2009-03-20 10:08
请问这个跟CodeSmith有什么区别吗?
8 楼 yuanye5188 2009-03-09 09:54
很好,很强大,值得使用!
可否给个oracle插件,谢谢(email:yuanye5188@msn.com)
7 楼 JaunLee 2009-02-26 15:09
好,俺鼓励一下!!!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics