`
dawuafang
  • 浏览: 1100243 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

本代码生成器的原理:提供一个可被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(可扩展参数数组)
@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):

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

}

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics