基于模板的通用代码生成器LKGenerator(二)-使用时的关键步骤,注意事项及实例

通过本文,您将了解本代码生成器使用时的关键步骤,使用时的注意事项及实例. 

本代码生成器的原理:提供一个可被jvm加载的class文件,然后通过java的注解和反射技术读取信息,通过本工具放入到Velocity运行时的变量中,从而利用Velocity模板生成代码.生成代码需要的关键文件:1)可被jvm加载的 class文件 , 2)用于生成代码的 模板 .

(一) 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(可扩展参数数组) 
@AutoField 
可以注解到属性字段上,可配置的属性: alias(别名), isRequired(是否必填项), isKey(是否主键), type(字段类型), combo(选择项数组), column(表中的列名), args(可扩展参数数组), length(表中字段长度) 
以上注解属性均可在velocity模板中引用. 

@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):

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;
  }
}

 以上介绍了该使用代码生成器在使用时的关键知识和步骤,   限于本人水平有限,很多地方写的并不完美,希望大家不吝赐教.不足之处欢迎留言交流,希望在和大家的交流中得到提高.  


  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值