通过本文,您将了解本代码生成器使用时的关键步骤,使用时的注意事项及实例.
本代码生成器的原理:提供一个可被jvm加载的class文件,然后通过java的注解和反射技术读取信息,通过本工具放入到Velocity运行时的变量中,从而利用Velocity模板生成代码.生成代码需要的关键文件:1)可被jvm加载的class文件, 2)用于生成代码的模板.
下载地址:(注:以下x86和x64版本是指电脑上安装的JDK版本,不是操作系统本身的版本)
(x86):http://download.csdn.net/detail/lk_blog/6961519
(x64):http://download.csdn.net/detail/lk_blog/6961547
(一) class文件的生成:您既可以使用本代码生成器生成带注解的class文件,也可以自己手写javaBean,然后编译为class文件.手写JavaBean时您既可以使用本工具提供的注解,也可以不使用任何注解.建议您使用注解,因为注解具有增强生成代码效果的功能.注解所需要的jar文件您可以在D:\.LKGenerator\.libs\auto-annotation.jar目录中找到(首次运行本软件时该目录中可能没有该jar,您可以运行本工具后,点击[实体类生成代码]-->[从实体类生成代码]菜单,这样您就可以在上述目录找到该jar了.)
(二)模板的编写:模板的编写遵循Velocity语法,您可以点击[帮助]-->[关于]后弹出的D:\.LKGenerator\.help中找到该语法的帮助文档velocity-api.txt,当然您也可以直接在百度中搜索"velocity语法"找到帮助.模板实例见本文章后半部分的讲解.
(三) Velocity模板中可使用的通用变量如下:
(1) ${base-package}包名的默认变量,该变量可同时在路径中引用,路径中使用时将自动把配置的点(.)转为路径分隔符(/).
(2) ${beans}实体类的类名集合.
${bean}实体类类名首字母变为小写.
${bean.Lname}同${bean},实体类类名首字母变为小写.
${bean.Uname}实体类类名首字母变为大写.
${bean.ALname}实体类类名全部变为小写字母.
${bean.AUname}实体类类名全部变为大写字母.
注:${bean},${bean.Lname},${bean.Uname},${bean.ALname},${bean.AUname},${base-package}可以用于模版中也可以用于路径和文件的命名.
注解增强Bean属性,需配置,例:@AutoBean(alias="xxx",table="xxx",args={"xxx","yyy"}):
${bean.alias}实体类注解中的alias值,如果实体类上没有配置,则默认为类名.可配置中文注释,生成代码时显示该注释.
${bean.table}实体类注解中的table值,对应数据库中的表名.
${bean.argsLength},${bean.argsSize}bean注解中的args参数数组配置的参数个数.
${bean.args[0]}bean注解中的args参数数组配置中的第一个值.
(3) ${bean.fields}实体类的字段集合,可对其进行循环.
${field}实体类属性名.
${field}实体属性首字母变为小写.
${field.Lname}同${bean},实体类属性首字母变为小写.
${field.Uname}实体类属性首字母变为大写.
${field.ALname}实体类属性全部变为小写字母.
${field.AUname}实体类属性全部变为大写字母.
注解增强Field属性,需配置,例: @AutoField(alias = "序号", isKey = true , isRequired = true , type="String", combo = {"男","女"},args={"xxx","yyy"})
${field.alias}实体属性注解中的alias值,默认为属性名.可配置中文注释,生成代码时显示该注释.
${field.isKey}实体属性注解中的isKey值,boolean类型,配置后可以使用${bean.key}变量.
${field.isRequired}实体属性中的isRequired属性,该属性可以配置该字段是否为必填项.
${field.type}实体类属注解中的类型,例如String,Integer...
${field.comboLength},${field.comboSize}实体属性注解中combo参数数组配置的参数个数.
${field.combo[0]}实体属性注解中combo参数数组配置中的第一个值.
${field.argsLength}}实体属性注解中的args参数数组配置的参数个数.
${field.args[0]}实体属性注解中args参数数组配置中的第一个值.
(四) 使用本工具生成class文件的过程如下:
1.创建表(本sql是从Mysql中导出)
CREATE TABLE `t_student` ( `id` varchar(36) NOT NULL DEFAULT ‘‘ COMMENT ‘序号‘, `name` varchar(255) NOT NULL DEFAULT ‘‘ COMMENT ‘姓名‘, `sex` varchar(255) DEFAULT NULL COMMENT ‘性别‘, `age` int(11) DEFAULT NULL COMMENT ‘年龄‘, `birthday` datetime DEFAULT NULL COMMENT ‘生日‘, `is_monitor` tinyint(1) DEFAULT NULL COMMENT ‘是否班长‘, `create_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘创建‘, `update_time` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘修改时间‘, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;2.数据表生成实体类-->配置
3.数据表生成实体类-->选择表
4.数据表生成实体类-->生成实体代码
本步骤生成了带注解的java文件,代码如下(可参考D:\.LKGenerator\dest-beans\Student.java文件).
import java.util.*; import com.tgb.lk.annotation.*; @AutoBean(alias = "Student",table="t_student") public class Student { @AutoField(alias = "序号", column = "id", isKey = true , isRequired = true , type="String", length=36) @ExcelVOAttribute(name = "id", column = "A") private String id; @AutoField(alias = "姓名", column = "name", isRequired = true, length = 255) @ExcelVOAttribute(name = "name", column = "B") private String name; @AutoField(alias = "性别", column = "sex", combo = {"男","女"}, length = 255) @ExcelVOAttribute(name = "sex", column = "C") private String sex; @AutoField(alias = "年龄", column = "age", type = "Integer") @ExcelVOAttribute(name = "age", column = "D") private int age; @AutoField(alias = "生日", column = "birthday", type = "Date") @ExcelVOAttribute(name = "birthday", column = "E") private Date birthday; @AutoField(alias = "班级ID", column = "clazz_id", length = 36) @ExcelVOAttribute(name = "clazz_id", column = "F") private String clazzId; @AutoField(alias = "是否班长", column = "is_monitor") @ExcelVOAttribute(name = "is_monitor", column = "G") private Boolean isMonitor; @AutoField(alias = "创建", column = "create_time", isRequired = true, type = "Date") @ExcelVOAttribute(name = "create_time", column = "H") private Date createTime; @AutoField(alias = "修改时间", column = "update_time", isRequired = true, type = "Date") @ExcelVOAttribute(name = "update_time", column = "I") private Date updateTime; public String getId() { return id; } public void setId(String id){ this.id = id; } public String getName() { return name; } public void setName(String name){ this.name = name; } public String getSex() { return sex; } public void setSex(String sex){ this.sex = sex; } public int getAge() { return age; } public void setAge(int age){ this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday){ this.birthday = birthday; } public String getClazzId() { return clazzId; } public void setClazzId(String clazzId){ this.clazzId = clazzId; } public Boolean getIsMonitor() { return isMonitor; } public void setIsMonitor(Boolean isMonitor){ this.isMonitor = isMonitor; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime){ this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime){ this.updateTime = updateTime; } }
(五)关于注解:
这里的注解变量可以在D:\.LKGenerator\.libs\auto-annotation.jar中找到.(首次运行本软件时该目录中可能没有该jar,您可以运行本工具后,点击[实体类生成代码]-->[从实体类生成代码]菜单,这样您就可以在上述目录找到该jar了.)
@AutoBean可以注解到类上,可配置的属性:alias(别名), table(表名), args(可扩展参数数组)@ExcelVOAttribute用于导入导出.name(excel显示列名),column(导出到哪一列,可配置A,B,C...),prompt(配置鼠标移到单元格显示的提示),combo(单元格为下拉框形式,配置其内显示的可选项),isExport(该列是否只导出表头)详细使用方式见:http://blog.csdn.net/lk_blog/article/details/8007777
(六)实体类生成代码配置说明
(1)配置模版路径,这个配置可以配置用于生成代码的velocity模版路径,放什么样的模板就生成相应的代码,这个目录您必须放置模板才能生成代码。
(2)配置生成代码的固定文件路径,这个配置中的文件将原样拷贝到最终生成的代码中,主要适用于非文本文件如*.jpg
*.jar等文件。
(3)配置引用jar路径,这个jar路径的配置是需要加载的class需要引用的jar,默认情况下您无需修改.
(4)注入模版的Bean(*.class)路径,这个路径下需放置实体Bean的class文件,默认情况下您无需修改,但如果您自己手写JavaBean,可将此配置配置为javaBean编译后的class存放路径。
(5)配置生成代码的根路径,这个路径即最终生成代码的路径,默认情况下您无需修改.。
(6)配置注入模板的键值,这个功能可以配置除默认注入到模版的变量之外的特殊变量,例:author=李坤,模板可用变量${author},base-package=com.tgb.lk,则模版中可使用${base-package},可根据您的需要增删变量.
(7)读取数据库中的数据用于生成代码。
本配置主要控制是否开启读取数据库中数据并作为模板输出到代码,建议不开启。开启本功能将自动将数据库中的数据转换成JavaBean并将此JavaBean作为模板变量的输入用于生成代码。
(七)模板实例及效果:
关于实例,您可以点击[帮助]-->[关于],在弹出的文件夹中找到D:\.LKGenerator\.help\example目录,该目录中包含的实例中提供了可变模板及生成代码效果.
模板(${bean.Uname}.java ,可参考D:\.LKGenerator\.help\example\templates-var\${base-package}\model\${bean.Uname}.java文件)
package ${base-package}.model; import java.util.*; import javax.persistence.*; import com.tgb.lk.util.base.model.BaseTimeModel; import com.tgb.lk.util.excel.ExcelVOAttribute; @Entity @Table(name = "t_${bean}") public class ${bean.Uname} extends BaseTimeModel{ #set ( $arr = [‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘] ) #foreach ($field in ${bean.fields}) #if(${field.isRequired}) @Column(name = "${field}", nullable = false) #else @Column(name = "${field}") #end @ExcelVOAttribute(name = "${field.alias}", column = "$arr[$velocityCount]") private ${field.type} ${field}; #end public ${bean.Uname}() { } #foreach ($field in ${bean.fields}) public ${field.type} get${field.Uname}() { return ${field}; } public void set${field.Uname}(${field.type} ${field}) { this.${field} = ${field}; } #end }生成的代码(Student.java, 可参考帮助文件D:\.LKGenerator\.help\example\dest-code\com\tgb\lk\model\Student.java):
package com.tgb.lk.model; import java.util.*; import javax.persistence.*; import com.tgb.lk.util.base.model.BaseTimeModel; import com.tgb.lk.util.excel.ExcelVOAttribute; @Entity @Table(name = "t_student") public class Student extends BaseTimeModel{ @Column(name = "id", nullable = false) @ExcelVOAttribute(name = "序号", column = "B") private String id; @Column(name = "name", nullable = false) @ExcelVOAttribute(name = "姓名", column = "C") private String name; @Column(name = "sex") @ExcelVOAttribute(name = "性别", column = "D") private String sex; @Column(name = "age") @ExcelVOAttribute(name = "年龄", column = "E") private Integer age; @Column(name = "birthday") @ExcelVOAttribute(name = "生日", column = "F") private Date birthday; @Column(name = "isMonitor") @ExcelVOAttribute(name = "是否班长", column = "G") private Boolean isMonitor; @Column(name = "createTime", nullable = false) @ExcelVOAttribute(name = "创建时间", column = "H") private Date createTime; @Column(name = "updateTime", nullable = false) @ExcelVOAttribute(name = "修改时间", column = "I") private Date updateTime; public Student() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Boolean getIsMonitor() { return isMonitor; } public void setIsMonitor(Boolean isMonitor) { this.isMonitor = isMonitor; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
基于模板的通用代码生成器LKGenerator(二)-使用时的关键步骤,注意事项及实例,布布扣,bubuko.com
基于模板的通用代码生成器LKGenerator(二)-使用时的关键步骤,注意事项及实例
原文:http://blog.csdn.net/lk_blog/article/details/19944005