MyBatis Generator官网地址:http://www.mybatis.org/generator/index.html
MyBaris Generator中文地址:http://mbg.cndocs.ml/
在MBG中,最主要也最重要的,就是generatorConfig.xml配置文件了,本篇主要就是详细介绍该配置文件内的内容。
【1.文件头】配置文件头:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
【2.根节点<generatorConfiguration>】<generatorConfiguration>为根节点,没有任何属性;如下:
<generatorConfiguration>
<!-- 配置具体内容 -->
</generatorConfiguration>
【3.<generatorConfiguration>子元素】<generatorConfiguration>主要有3个子元素,有严格的顺序;
1:<properties>(0个或多个)
2:<classPathEntry>(0个或多个)
3:<context>(1个或多个)
【3.1.<properties>元素】这个元素主要用来指定外部的属性元素,不是必须的元素。
<properties>元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以再配置中使用${property}的方式进行属性引用,通过这种方式引用属性文件中的属性值。比如常规的配置“jdbc”信息的引用:${url}, ${username}等
这个元素有两个属性resurce和url,分别为两种引入方式,两个属性只能使用其中一个,同时出现会报错。
-
resource:指定**classpath**下的属性文件,使用类似com/myproject/generatorConfig.properties这样的属性值
-
url:可以指定文件系统上的特定位置,例如:file:///C:/myfloder/generatorConfig.properties
<!-- 引入配置文件 -->
<properties resource="mybatis\config\init.properties" />
【3.2.<classPathEntry>元素】这个元素可以1个或多个,不受限制。
这个属性是引入需要依赖的jar路径,最常用的用法就是指定驱动程序的路径,例如:
<!-- 数据库驱动jar路径 -->
<classPathEntry location="${driverClassPath}" />
注意:classPathEntry只有在下面这两种情况下才有效:
1:当加载JDBC驱动内省数据库时;
2:当加载根类中的javaModelGenerator检查重写的方法时;
【3.3.<context>元素】在MBG的配置中,至少需要一个<context>元素;
<context>元素用于指定一组对象的环境。在运行MBG的时候可以指定要运行的<context>
该元素只有一个“必选属性”id,用来唯一确定一个<context>元素,该id属性可以再运行MBG时使用。
此外还有几个“可选属性”:
- defaultModelType:这个属性用来设置生成对象类型的默认值。 对象类型定义了MBG如何生成实体类。 对某些对象类型,MBG会给每一个表生成一个单独的实体类。 对另外一些对象类型,MBG会根据表结构生成不同的类。
这个属性有以下可选值:
1:conditional:*这是默认值*,这个模型和hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
2:flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。
3:hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系(注:BLOB类 继承 其他字段类 继承 主键类)。
- targetRuntime:此属性用于指定生成的代码的运行时目标。
该属性支持这些特殊的值:
1:MyBatis3:这是默认值 ,使用这值的时候,MBG会生成兼容MyBatis 3.0或更高版本, 兼容JSE 5.0或更高版本的对象(例如Java模型类和Mapper接口会使用泛型)。 这些生成对象中的"by example"方法将支持几乎不受限制的动态的where子句。 另外,这些生成器生成的Java对象支持JSE 5.0特性,包含泛型和注解。
2:MyBatis3Simple:使用这值的时候,和上面的MyBatis3类似,但是不会有"by example"一类的方法,只有少量的动态SQL。
3:Ibatis2Java2:使用这值的时候,MBG会生成兼容iBATIS 2.2.0或更高版本(除了iBATIS 3),还有Java2的所有层次。 这些生成对象中的"by example"方法将支持几乎不受限制的动态的where子句。 这些生成的对象不能100%和原生的Abator或其他的代码生成器兼容。
4:Ibatis2Java5:使用这值的时候,MBG会生成兼容iBATIS 2.2.0或更高版本(除了iBATIS 3), 兼容JSE 5.0或更高版本的对象(例如Java模型类和Dao类会使用泛型)。 这些生成对象中的"by example"方法将支持几乎不受限制的动态的where子句。 另外,这些生成器生成的Java对象支持JSE 5.0特性,包含泛型和注解。 这些生成的对象不能100%和原生的Abator或其他的代码生成器兼容。
如果您想创建一个完全不同的代码生成器, 使用一个继承了org.mybatis.generator.api.IntrospectedTable类的权限定类名替换该值。 通过这个值,您可以创建您自己的代码生成器,然后插入到代码生成器引擎中。
- introspectedColumnImpl:使用这个值去指定一个继承了org.mybatis.generator.api.IntrospectedColumn类的权限定名称。 这可以修改代码生成器计算列信息时候的行为。
一般情况下,我们使用如下的配置即可:
<context id="mySql" defaultModelType="flat">
如果你希望不生成和Example
查询有关的内容,那么可以按照如下进行配置:
<context id="mySql" defaultModelType="flat" targetRuntime="MyBatis3Simple">
MBG配置中的其他几个元素,基本上都是<context>
的子元素,这些子元素(有严格的配置顺序)包括:
- <property>(0个或多个)
- <plugin>(0个或多个)
- <commentGenerator>(0个或1个)
- <jdbcConnection>(1个)
- <javaTypeResolver>(0个或1个)
- <javaModelGenerator>(1个)
- <sqlMapGenerator>(0个或1个)
- <javaClientGenerator>(0个或1个)
- <table>(1个或多个)
【3.3.2.<plugin>元素】:plugin顾名思义,插件,可以用来定义一个插件,可以配置0个或多个,不受限制,用于扩展或修改通过MyBatis Generator(MBG)代码生成器生成的代码。插件按照在配置文件中的顺序执行。
MyBatis Generator自带的插件在org.mybatis.generator.plugins包下面:
反编译插件源码,会发现所有插件的公共父类PluginAdapter为一个抽象类
因此,我们可以通过继承PluginAdapter开发我们自己的MBG插件,此处不再赘述。
此处列出常用的几个插件配置:
<!-- 插件1: 为生成的javaModel创建一个toString的方法-->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- 插件2: 为生成的javaModel生成equals和hashCode方法 -->
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<!-- 插件3: 让生成的类实现Serializable接口,并生成序列化标记 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
有关插件的详细信息我们可以参考官方文档中的开发插件和提供的插件了解更多。
【3.3.3.<commentGenerator>元素】该元素最多可以配置1个。
这个元素非常有用,是用来定义注释生成器的属性。 注释生成器用来给由 MyBatis Generator (MBG) 生成的多种元素(Java自动,Java方法,XML元素等等)生成注释。
默认的实现类是 org.mybatis.generator.internal.DefaultCommentGenerator。 如果您只想修改某些行为,默认的实现类专门为扩展进行设计。
支持的属性:
- suppressAllComments:这个属性用来指定MBG生成的代码中是否包含任何注释。 这个属性有以下可选值:
1:false:默认值;当这个属性是false或者没有指定时,所有生成的元素都会包含用来说明这是生成元素的注释。
2:true:当这个属性是true时,不会往生成的元素中添加任何注释。
警告: 如果您将这个值设为true,那么所有的代码合并都会被禁用。
- suppressDate:这个元素用来指定生成的注释中是否包含生成的日期。 这个属性有以下可选值:
1:false:默认值;当这个属性是false或者没有指定时,所有元素生成注释时都会带着生成时间。
2:true:当这个属性是true时,注释中不会添加时间戳。
<!-- 1:注释构建;type-可通过实现CommentGenerator接口构建自定义的注释构建类 -->
<commentGenerator>
<!-- 是否去除自动生成的注释;true:是;false:否 -->
<property name="suppressAllComments" value="false" />
<!-- 个用来指定生成的注释中是否包含生成的日期 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
可以通过实现org.mybatis.generator.api.CommentGenerator接口来自定义创建注释生成器;
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用**版本控制**的时候每次都会提交,因而一般情况下我们都会创建自定义的注释生成器,接下来我们简单举例实现生成包含表字段注释信息的注释:
因为系统提供了一个默认的实现类,所以对我们来说,自己实现一个会很容易,最简单的方法就是复制默认实现类代码到一个新的文件中,修改类名如MyCommentGenerator
,在你自己的实现类中,你可以选择是否继续支持上面的两个属性,你还可以增加对其他属性的支持。
我们通过下面一个方法的修改来了解,其他几个方法请自行修改(写本章的时候我也没有完全实现该类,所以不提供完整源码了):
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
}
这个方法是给字段添加注释信息的,其中IntrospectedColumn
包含了字段的完整信息,通过getRemarks
方法可以获取字段的注释信息。上面这个方法修改起来还是很容易的。除了字段的注释外还有Getter
和Setter
,以及类的注释。此外还有生成XML的注释,大家可以根据默认的实现进行修改。
完成我们自己的实现类后,我们还需要做如下配置:
<commentGenerator type="com.mybatis.generator.MyCommentGenerator">
<!-- 是否去除自动生成的注释;true:是;false:否 -->
<property name="suppressAllComments" value="false" />
<!-- 个用来指定生成的注释中是否包含生成的日期 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
因为JDK默认编码方式为GBK,所以我们要设置编码方式为UTF-8,这样就可以生成中文注释了:
<-- 指定生成的java文件的编码方式,因为jdk自带编码方式为GBK,此处不设置,生成的java文件会出现中文乱码问题 -->
<property name="javaFileEncoding" value="UTF-8" />
效果如图:
【3.3.4.<jdbcConnection>元素】该元素用于指定数据库的连接信息,该元素必选,并且只能有一个。
配置该元素时需要注意,如果JDBC驱动程序不在**classpath**下,就需要通过<classPathEntry>元素引入jar包;
该元素有两个必选属性:
- driverClass:访问数据库的JDBC驱动程序的完全限定类名
- connectionURL:访问数据库的JDBC连接
该元素还有两个可选属性:
- userId:访问数据库的用户的id
- password:访问数据库的密码
该元素还可以接受多个<property>子元素,在这里配置的<property>属性都会添加到JDBC驱动的属性中去。
这个元素配置起来相对最容易,例:
<!-- 2:数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="${jdbcurl}" userId="${username}" password="${password}">
</jdbcConnection>
【<table>元素】该元素至少要配置一个,可以配置多个。
该元素用来配置要通过内省的表,只有配置的才会生成实体类和其他文件。
该元素有一个必选属性:
- tableName :指定要生成的表名,可以使用SQL通配符匹配多个表。
例如要生成全部的表,可以如下配置:
<!-- 指定要生成的表信息 -->
<table tableName="%"></table>
。。。