出处:http://blog.csdn.net/isea533/article/details/42102297
MyBatis Geneator中文文档地址:
http://generator.sturgeon.mopaas.com/
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。
本文使用Markdown进行编辑,但是博客显示效果不好,所以建议移步这里进行阅读
本文是作为个人筹划的《Mybatis最佳实践》(gitbook)其中的一节。
本文中所有节点的链接都是对应的中文文档地址,可以点击查看详细信息。
下载本文档的PDF版本
注:本文后面提到的**MBG**全部指代MyBatis Generator。
有4种运行MBG的方法,具体请看文档 运行 MyBatis Generator
MBG下载地址:http://repo1.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/
后续会专门为gitbook完善此部分
在MBG中,最主要也最重要的就是XML配置文件,因此本篇文章主要的内容就是XML配置。
这里按照配置的顺序对配置逐个讲解,更细的内容可以配合中文文档参照。
使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的DOCTYPE
。
generatorConfiguration
节点没有任何属性,直接写节点即可,如下:
子元素从这段开始,就是配置的主要内容,这些配置都是generatorConfiguration
元素的子元素。
包含以下子元素(有严格的顺序):
(0个或1个)
(0个或多个)
(1个或多个)
元素这个元素用来指定外部的属性元素,不是必须的元素。
元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}
这种形式的引用,通过这种方式引用属性文件中的属性值。 对于后面需要配置的**jdbc信息**和targetProject
属性会很有用。
这个属性可以通过resource
或者url
来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错。
resource
:指定**classpath**下的属性文件,使用类似com/myproject/generatorConfig.properties
这样的属性值。
url
:可以指定文件系统上的特定位置,例如file:///C:/myfolder/generatorConfig.properties
元素这个元素可以0或多个,不受限制。
这个元素的作用是将MBG运行时需要用到的jar包(或zip格式)添加到**classpath**下。
最常见的用法是,当**classpath**下面**没有**JDBC驱动的时候,我们通常通过这个属性指定驱动的路径,例如:
如果需要用到其他的jar包,也可以这么配置,例如如果你开发了一个MBG的插件,你就可以通过这种方式加入到**classpath**
这里注意上面重点强调的 没有,一般在项目中使用的时候,**classpath**下面都有JDBC驱动,因此从项目中启动的时候不需要配置该项。
建议:由于该参数使用了绝对路径,因此不利用在不同电脑上通用,因此建议最好把需要的jar包放到项目的**classpath**下,避免每个人都得单独配置路径。
元素在MBG的配置中,至少需要有一个元素。
元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的
。
该元素只有一个**必选属性**id
,用来唯一确定一个元素,该
id
属性可以在运行MBG的使用。
此外还有几个**可选属性**:
defaultModelType
:**这个属性很重要**,这个属性定义了MBG如何生成**实体类**。
这个属性有以下可选值:
conditional
:*这是默认值*,这个模型和下面的hierarchical
类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
flat
:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**
hierarchical
:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime
:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:
MyBatis3
:*这是默认值*
MyBatis3Simple
Ibatis2Java2
Ibatis2Java5
一般情况下使用默认值即可,有关这些值的具体作用以及区别请查看中文文档的详细内容。
introspectedColumnImpl
:该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn
该类的实现类。该属性的作用可以查看扩展MyBatis Generator。
一般情况下,我们使用如下的配置即可:
如果你希望不生成和Example
查询有关的内容,那么可以按照如下进行配置:
使用MyBatis3Simple
可以避免在后面的
中逐个进行配置(后面会提到)。
MBG配置中的其他几个元素,基本上都是的子元素,这些子元素(有严格的配置顺序)包括:
(0个或多个)
(0个或多个)
(0个或1个)
(1个)
(0个或1个)
(1个)
(0个或1个)
(0个或1个)
其中属性比较特殊,后面讲解的时候都会和父元素一起进行讲解。在讲解
属性前,我们先看看**什么是分隔符?**。
这里通过一个例子说明。假设在Mysql数据库中有一个表名为user info
,你没有看错,中间是一个空格,这种情况下如果写出select * from user info
这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子:
select * from `user info`
这里的使用的**反单引号(`)**就是**分隔符**,**分隔符**可以用于**表名**或者**列名**。
下面继续看支持的属性:
autoDelimitKeywords
beginningDelimiter
endingDelimiter
javaFileEncoding
javaFormatter
xmlFormatter
由于这些属性比较重要,这里一一讲解。
首先是autoDelimitKeywords
,当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加**分隔符**。
然后这里继续上面的例子来讲beginningDelimiter
和endingDelimiter
属性。
由于beginningDelimiter
和endingDelimiter
的默认值为双引号("
),在Mysql中不能这么写,所以还要将这两个默认值改为**反单引号(`)**,配置如下:
属性javaFileEncoding
设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
最后两个javaFormatter
和xmlFormatter
属性**可能会**很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定这两个属性的值来实现。
接下来分节对其他的子元素逐个进行介绍。
元素该元素可以配置0个或者多个,不受限制。
元素用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
插件将按在配置中配置的顺序执行。
有关插件的详细信息可以参考开发插件和提供的插件了解更多。
元素该元素最多可以配置1个。
这个元素非常有用,相信很多人都有过这样的需求,就是希望MBG生成的代码中可以包含**注释信息**,具体就是生成表或字段的备注信息。
使用这个元素就能很简单的实现我们想要的功能。这里先介绍该元素,介绍完后会举例如何扩展实现该功能。
该元素有一个可选属性type
,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator
接口。而且必有一个默认的构造方法。这个属性接收默认的特殊值DEFAULT
,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator
。
默认的实现类中提供了两个可选属性,需要通过属性进行配置。
suppressAllComments
:**阻止**生成注释,默认为false
suppressDate
:**阻止**生成的注释包含时间戳,默认为false
一般情况下由于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的注释,大家可以根据默认的实现进行修改。
完成我们自己的实现类后,我们还需要做如下配置:
元素用于指定数据库连接信息,该元素必选,并且只能有一个。
配置该元素只需要注意如果JDBC驱动不在**classpath**下,就需要通过元素引入jar包,这里**推荐**将jar包放到**classpath**下。
该元素有两个必选属性:
driverClass
:访问数据库的JDBC驱动程序的完全限定类名
connectionURL
:访问数据库的JDBC连接URL
该元素还有两个可选属性:
userId
:访问数据库的用户ID
password
:访问数据库的密码
此外该元素还可以接受多个子元素,这里配置的
属性都会添加到JDBC驱动的属性中。
这个元素配置起来最容易,这里举个简单例子:
元素该元素最多可以配置一个。
这个元素的配置用来指定JDBC类型和Java类型如何转换。
该元素提供了一个可选的属性type
,和比较类型,提供了默认的实现
DEFAULT
,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性。
该属性还有一个可以配置的元素。
可以配置的属性为forceBigDecimals
,该属性可以控制是否强制DECIMAL
和NUMERIC
类型的字段转换为Java类型的java.math.BigDecimal
,默认值为false
,一般不需要配置。
默认情况下的转换规则为:
如果精度>0
或者长度>18
,就会使用java.math.BigDecimal
如果精度=0
并且10<=长度<=18< code="">,就会使用
java.lang.Long
如果精度=0
并且5<=长度<=9< code="">,就会使用
java.lang.Integer
如果精度=0
并且长度<5< code="">,就会使用
java.lang.Short
如果设置为true
,那么一定会使用java.math.BigDecimal
,配置示例如下:
元素该元素必须配置一个,并且最多一个。
该元素用来控制生成的实体类,根据中配置的
defaultModelType
,一个表可能会对应生成多个不同的实体类。一个表对应多个类实际上并不方便,所以前面也推荐使用flat
,这种情况下一个表对应一个实体类。
该元素只有两个属性,都是必选的。
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(
targetProject
:指定目标项目路径,使用的是文件系统的绝对路径。
该元素支持以下几个子元素属性:
constructorBased
:该属性只对MyBatis3
有效,如果true
就会使用构造方法入参,如果false
就会使用setter
方式。默认为false
。
enableSubPackages
:如果true
,MBG会根据catalog
和schema
来生成子包。如果false
就会直接用targetPackage
属性。默认为false
。
immutable
:该属性用来配置实体类属性是否可变,如果设置为true
,那么constructorBased
不管设置成什么,都会使用构造方法入参,并且不会生成setter
方法。如果为false
,实体类属性就可以改变。默认为false
。
rootClass
:设置所有实体类的基类。如果设置,需要使用类的全限定名称。并且如果MBG能够加载rootClass
,那么MBG不会覆盖和父类中完全匹配的属性。匹配规则:
属性名完全相同
属性类型相同
属性有getter
方法
属性有setter
方法
trimStrings
:是否对数据库查询结果进行trim
操作,如果设置为true
就会生成类似这样public void setUsername(String username) {this.username = username == null ? null : username.trim();}
的setter
方法。默认值为false
。
配置示例如下:
元素该元素可选,最多配置一个。但是有如下两种必选的特殊情况:
如果targetRuntime
目标是**iBATIS2**,该元素必须配置一个。
如果targetRuntime
目标是**MyBatis3**,只有当需要XML时,该元素必须配置一个。 如果没有配置
,则使用以下的规则:
如果指定了一个,那么MBG将只生成XML的SQL映射文件和实体类。
如果没有指定,那么MBG将只生成实体类。
该元素只有两个属性(和前面提过的的属性含义一样),都是必选的。
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(
targetProject
:指定目标项目路径,使用的是文件系统的绝对路径。
该元素支持子元素,只有一个可以配置的属性:
enableSubPackages
:如果true
,MBG会根据catalog
和schema
来生成子包。如果false
就会直接用targetPackage
属性。默认为false
。
配置示例:
元素该元素可选,最多配置一个。
如果不配置该元素,就不会生成Mapper接口。
该元素有3个必选属性:
type
:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator
类,必选有一个默认的构造方法。 该属性提供了以下预定的代码生成器,首先根据的
targetRuntime
分成三类:
IBATIS:生成的对象符合iBATIS的DAO框架(不建议使用)。
GENERIC-CI:生成的对象将只依赖于SqlMapClient,通过构造方法注入。
GENERIC-SI:生成的对象将只依赖于SqlMapClient,通过setter
方法注入。
SPRING:生成的对象符合Spring的DAO接口
ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider
注解方法会被XML替代。
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
MyBatis3:
MyBatis3Simple:
Ibatis2Java2或**Ibatis2Java5**:
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(
targetProject
:指定目标项目路径,使用的是文件系统的绝对路径。
该元素还有一个可选属性:
implementationPackage
:如果指定了该属性,实现类就会生成在这个包中。
该元素支持子元素设置的属性:
enableSubPackages
exampleMethodVisibility
methodNameCalculator
rootInterface
useLegacyBuilder
这几个属性不太常用,具体作用请看完整的文档,这里对rootInterface
做个简单介绍。
rootInterface
用于指定一个所有生成的接口都继承的父接口。 这个值可以通过
配置的rootInterface
属性覆盖。
这个属性对于通用Mapper来说,可以让生成的所有接口都继承该接口。
配置示例:
更多点击原链接。