基于JavaScript的代码自动生成工具
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 方法.
脚本块
- <$
//Javascript code like: println(sys_fields[0].name);
$> 执行一段代码 - <$=sys_fields[0].name$> 显示表达式的值
预定义的变量
- sys_table_name: 当前表名
- sys_fields: 当前表的Field 对象数组. 使用sys_fields.length 来获取字段的数目.
- sys_keys: 当前表主键的数组, 使用sys_keys.length来获取主键字段的数量.
- sys_user_name: 当前连接数据库的用户名
- sys_db_name: 当前连接到数据库的名字
- sys_output: 内部使用,存储生成的中间JavaScript代码
- 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.
预定义的方法
- print(str). 输出str, 没有换行
- println(str). 输出str, 结尾换行
- getFieldList(). 返回字段列表, 用',' 分割
- 一些其他的javascript 方法, 如capitalize, lowercase, uppercase, trim等等. 你也可以通过Tools/Edit public functions增加自己常用的方法
使用步骤
- 创建一个新项目, 设定数据库连接参数
- 添加目录和模板, 模板采用JavaScript脚本语言, 唯一的区别是用<$ you code$> 把代码包起来, 或者用<%=expression%> 来打印一个表达式
- 生成文件, 分为三种方式: 生成文件, 生成项目中的所有文件, 批量生成(多表, 多模板)
数据库连接参数
- 选择数据库类型
- 输入需要的信息, 如host, port, username, password and database name
生成文件
- 生成当前文件, Template/Generate current file
- 生成项目的所有文件, Project/Generate Project Files
- 批量生成, Project/Batch Generate, 然后选择需要生成文件的tables和 templates(folders) 生成文件.
Tips
- 使用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] %>); <$ } $>
- 在项目属性对话框中写一些项目使用的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
改进这个工具:
如果有下面的问题, 请和我联系:
- 需要一个新的数据库插件或者你写了一个新的数据库插件
- 不知道如何使用这个工具
- 发现了Bug
- 其他任意的建议...
最后希望这个工具对你能够有所帮助, 同时减少编码时Copy&Paste的时间
上一篇: 最酷的 Linux 单行命令
推荐阅读
-
基于JavaScript的代码自动生成工具
-
基于jQuery的输入框无值自动显示指定数据的实现代码_jquery
-
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)_PHP教程
-
php-php进阶 - 前端自动化工具如何在已经完成的php框架的代码里起作用?
-
php 生成自动创建文件夹并上传文件的示例代码_PHP
-
基于jQuery的输入框无值自动显示指定数据的实现代码_jquery
-
自动生成代码工具--APT
-
SpringBoot根据目录结构自动生成路由前缀的实现代码
-
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用,yii2gii_PHP教程
-
让你的博文自动带上缩址的实现代码,方便发到微博客上_javascript技巧