MyBatis-Generator 是 MyBatis 提供的一个代码生成工具,可以帮助我们生成数据库表对应的持久化对象(也称作 Model、PO)、操作数据库的接口(dao)、简单 SQL 的 mapper(XML 形式或注解形式)。
MyBatis-Generator (常简写为 MBG 或 mbg)是一个独立工具,你可以下载它的 jar 包来运行,也可以在 Ant 和 Maven 中运行。其官方网址为:mybatis.org/generator/
一、引入 MyBatis-Generator 及环境
对于这篇博文,我是在基于 SpringBoot 的 Maven 项目环境中配置、使用和讲解的,使用的 IDE 是 IntelliJ IDEA。
既然需要使用 MyBatis-Generator,那么在项目中就一定使用了 MyBatis 和某一种数据库,并且这些依赖应该已经在 Maven 中配置好了。例如 pom 文件中的配置:
1 | 复制代码<dependencies> |
对于在 Maven 项目中引入 MyBatis-Generator,这里介绍两种方式,具体需要用哪种方式取决于你使用哪种方式来运行 MyBatis-Generator 工具:(对于如何运行 MyBatis-Generator 工具,参见本文第三节)
1. 方式一:在 Maven 中导入依赖
这种方式适用于:用 Java 代码来运行 MyBatis-Generator 工具。在 pom 文件中引入 mybatis-generator-core 依赖:
1 | 复制代码<dependencies> |
2. 方式二:在 Maven 中引入插件
这种方式适用于:通过 Maven 项目的 Plugins 或 Maven 的命令行来运行 MyBatis-Generator 工具。在 pom 文件中引入 mybatis-generator-maven-plugin 插件:
1 | 复制代码<build> |
二、MyBatis-Generator 配置文件
MyBatis-Generator 需要一个 xml 配置文件,来详细配置生成代码的各种细节。例如,在项目的 resources 目录下新建一个 mybatis-generator-config.xml 配置文件:
其内容如下:
1 | 复制代码<?xml version="1.0" encoding="UTF-8"?> |
在该文件中,所有的配置均在根元素 generatorConfiguration 下。根元素 generatorConfiguration 有 3 个子元素可供配置,这 3 个子元素必须按照下面给出的次数和顺序进行配置:(没错,MyBatis-Generator 对配置的顺序也有严格的要求)
- properties (0 or 1),可出现 0 次或 1 次。
- classPathEntry (0…N),可出现 0 次或多次。
- context (1…N),至少出现 1 次。
其中,properties 和 classPathEntry 元素用于引入外部配置或文件;context 是核心元素,里面包含有各种详细配置。
1. 引入外部配置文件
在配置 MyBatis-Generator 时,是可以引入外部配置或文件的。
properties 元素
元素 properties 可以用于加载外部配置项或配置文件,该元素有两个属性,均用来指定外部配置文件的地址:
- resource:使 MBG 从 classpath 开始查找;一般可以使用相对于当前 xml 配置文件的相对路径。
- url:采用 URL 的方式;例如可以使用 file 协议
file:///Users/deecyn/Files/mybatis-generator.properties
从计算机本地查找,也可以使用 http 协议在互联网上查找,等等。
注意,这两个属性只能选择一个使用。例如,引入下图中的 mybatis-generator.properties 配置文件:
用于引入文件的代码如下:
1 | 复制代码<!-- 引入外部配置文件 --> |
之后在整个 xml 配置文件中就可以通过 ${propertyKey}
的方式来引用配置项。
classPathEntry 元素
使用 classPathEntry 元素,可以在 MBG 工作的时候,加载额外需要的依赖包。其中,location 属性指明需要加载的 jar/zip 包的全路径。例如:
1 | 复制代码<!-- 加载需要的额外的依赖包 --> |
2. 配置 context 核心元素
在 generationConfiguration 的子元素中,context 是核心元素,用于配置生成一组对象的环境。元素 context 有 4 个属性可供配置:
- id,必填,上下文 id,用于在生成错误时提示;保证多个 context 的 id 不重复就行。
- targetRuntime,选填项,这个配置会影响生成的 dao 和 mapper.xml 的内容。常见值为:
- MyBatis3,默认值,生成基于 MyBatis 3.x 以上版本的内容,包括很多类似 XxxByExample 的 dao 方法。
- MyBatis3Simple,类似 MyBatis3,只是不生成类似 XxxByExample 的 dao 方法,一般选择不生成这些繁杂的方法。
- 还有其它可配置的值,详情见 官网 。
- defaultModelType,选填项,用于指定生成对象的样式。其值为:
- conditional,默认值,类似于 hierarchical。区别是,不会为只有一个字段的数据库表生成一个单独的类。
- hierarchical,主键生成一个 XxxKey 对象(key class),Blob 等字段单独生成一个对象,其它简单属性在一个对象中(record class)。
- flat,所有字段(主键、blob 等)全部生成在一个对象中。
- introspectedColumnImpl,选填项,类全限定名,用于 扩展 MBG 。
示例配置如下:
1 | 复制代码<context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> |
context 的子元素
元素 context 中,有多个子元素需要配置。同样的,context 的子元素必须按照下面给出的次数和顺序进行配置:
- property (0…N)
- plugin (0…N)
- commentGenerator (0 or 1)
- connectionFactory 和 jdbcConnection,二选一进行配置
- javaTypeResolver (0 or 1)
- javaModelGenerator(有且仅有 1 次)
- sqlMapGenerator (0 or 1)
- javaClientGenerator (0 or 1)
- table (1…N)
可以看出,javaModelGenerator、table 以及 connection 元素的配置是必需的。
property 元素
用于为代码生成指定属性,或为其它元素指定属性。可以配置零个或多个,常见的 property 配置如下:
1 | 复制代码<!-- 自动识别数据库关键字,默认为 false,一般保留默认值,遇到数据库关键字(Java关键字)时,按照 table 元素中 columnOverride 属性的配置进行覆盖; |
plugin 元素
配置插件,可以有零个或多个,常见的 plugin 配置有:
1 | 复制代码<!-- 使生成的 Model 实现 Serializable 接口 --> |
commentGenerator 元素
可以配置 0 个或 1 个,用来配置生成的注释,默认是生成注释的,并且会在注释中添加时间等信息。如果想沿用默认的注释配置的话,可以不用配置 commentGenerator 元素。否则,可以进行如下配置:
1 | 复制代码<commentGenerator> |
当然,你也可以 自定注释生成器 。
jdbcConnection 元素
配置数据库连接,具体如下:
1 | 复制代码<!-- 配置数据库连接 --> |
其中,${propertyKey}
里面是引用的外部配置文件中的 propertyValue:
你也可以写死,那么就不用在 <properties resource=""/>
中引入此文件了。
这里面值得注意的是 <property name="nullCatalogMeansCurrent" value="true"/>
,当 mysql-connector-java 驱动在 8.0 版本以上时,如果不配置这一项为 true,会不生成指定数据库中表的 Mapper。具体原因可参考文章:MyBatis Generator踩坑与自救 。
javaTypeResolver 元素
可以配置 0 或 1 个,用来配置 JDBC 到 Java 中的类型转换规则,如果不进行配置,则使用默认的转换规则,默认使用 org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl
。
就算要配置,也只能配置 BigDecimal 和时间类型的转换:
1 | 复制代码<javaTypeResolver> |
javaModelGenerator 元素
Java 模型生成器,有且仅能配置一个,负责 key 类(见 context 元素的 defaultModelType 属性)、Java Bean 实体类、查询类的生成。
元素 javaModelGenerator 有两个属性:
- targetPackage:生成的类要放的包,具体的包受子元素 enableSubPackages 影响;
- targetProject:目标项目,指定一个已存在的目录。(targetProject 的路径配置,对于不同的 MBG 启动方式会有一些区别,详情见第三节:运行 MyBatis-Generator)
在 javaModelGenerator 元素中还可以配置多个 property 子元素,具体代码如下:
1 | 复制代码<!-- 配置 Java 模型生成器 --> |
sqlMapGenerator 元素
可以配置 0 或 1 个,生成 SQL Map 的 xml 文件生成器。在 MyBatis3 之后,我们可以使用 mapper.xml 文件 + Mapper 接口,或者只使用 Mapper 接口 + Annotation;所以,如果 javaClientGenerator 元素中配置了需要生成 xml 的话,这个元素就必须配置。
该元素有 targetPackage 和 targetProject 两个属性,原理与 javaModelGenerator 元素的相同,只不过这里指的是 resource 目录下存放 mapper.xml 文件的路径。具体代码如下:
1 | 复制代码<!-- SQL Map 的 xml 文件生成器 --> |
javaClientGenerator 元素
可以配置 0 或 1 个,用于配置关于 Mapper 接口的生成,如果没有配置该元素,那么默认不会生成 Mapper 接口。
元素 javaClientGenerator 有 3 个属性,其中 targetPackage 和 targetProject 属性的配置与 javaModelGenerator 元素的原理相同,只不过这里指的是 java 目录下存放 Mapper 接口的路径。关于 type 属性,有 3 个可选值:
- ANNOTATEDMAPPER,按照使用 Mapper 接口 + Annotation 的方式生成文件,SQL 生成在对应的 Annotation 中,不会生成 xml 文件。
- MIXEDMAPPER,使用混合配置,会生成 Mapper 接口,并适当添加合适的 Annotation,也会有 SQL 生成在 XML 文件中。
- XMLMAPPER,会生成 Mapper 接口,接口完全依赖 XML 文件。
注意,如果 context 元素的 defaultModelType 属性设置为 MyBatis3Simple,那么就只支持 ANNOTATEDMAPPER 和 XMLMAPPER 的方式。一般建议将 type 设置成 XMLMAPPER。
1 | 复制代码<!-- 关于 Mapper 接口的生成 --> |
table 元素
一个 table 元素对应一张数据库表,如果想同时为多张表生成代码,需要配置多个 table 元素;或者可以将 tableName 设置为 % 来为全部表生成代码。
元素 table 除开一个必须的属性 tableName(数据库表名称)需要设置外,还有很多可选的属性,部分属性如下:
- schema,数据库的 schema;
- catalog,数据库的 catalog;
- domainObjectName:生成的 domain 类的名字,如果不设置,直接使用表名的驼峰命名作为 domain 类的名字;可以设置为 somepackage.domainName,那么会自动把 domainName 类再放到 somepackage 包里面;
- enableSelectByExample,默认 true,MyBatis3Simple 为 false,指定是否生成动态查询语句;
- enableUpdateByPrimaryKey,默认 true,指定是否生成按照主键修改对象的语句(即 update);
- enableDeleteByExample,默认 true,MyBatis3Simple 为 false,指定是否生成动态删除语句;
- enableCountByExample,默认 true,MyBatis3Simple 为 false,指定是否生成动态查询总条数语句(用于分页的总条数查询);
- enableUpdateByExample,默认 true,MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);
- modelType,参考 context 元素的 defaultModelType,相当于对其进行覆盖。
此外,table 元素中还可以配置多个 property 和 columnOverride 等子元素。示例代码如下:
1 | 复制代码<!-- 配置需要生成代码的数据库表 --> |
三、运行 MyBatis-Generator
对于 MyBatis-Generator,不同的运行方式,对项目和文件的配置会有一些区别,本文介绍两种运行 MBG 的方式。
方式一:使用 Java 代码编程运行
通过这种方式运行 MBG,在本文的第一节,引入 MyBatis-Generator 时,需要按照方式一在 Maven 的 pom 文件中引入依赖:
1 | 复制代码<dependencies> |
然后在项目中新建一个 Java 类,代码类似下面:
1 | 复制代码package deecyn.shop_02.mbg; |
运行类中的 main() 方法即可在相应的目录下生成对应的代码。
需要注意的是,当你的项目中有多个 Module 时,在配置 javaModelGenerator、sqlMapGenerator 和 javaClientGenerator 元素的 targetProject 属性时,需要在前面加上当前的 Module 名称。例如当前的 Module 名称为 shop_02 时:
1 | 复制代码<javaModelGenerator targetPackage="deecyn.shop_02.mbg.model" targetProject="shop_02/src/main/java"/> |
否则会提示找不到对应的 java 和 resource 目录。
方式二:通过 Maven 插件运行
通过这种方式运行 MBG,在本文的第一节,引入 MyBatis-Generator 时,需要按照方式二在 Maven 的 pom 文件中引入插件,此外还需要进行一些配置:
1 | 复制代码<build> |
配置好后,双击 Maven –> Plugins 中的 MyBatis-Generator 运行:
即可在相应的目录下生成对应的代码。
需要注意的是,此时,在配置 javaModelGenerator、sqlMapGenerator 和 javaClientGenerator 元素的 targetProject 属性时,其路径都是相对于当前 Project 或 Module 的,不需要加前缀。例如当前的 Module 名称为 shop_02 时:
1 | 复制代码<javaModelGenerator targetPackage="deecyn.shop_02.mbg.model" targetProject="src/main/java"/> |
否则会提示找不到对应的 java 和 resource 目录。
四、完整配置文件参考
1. 完整的 pom 配置文件
参考链接:Notes: mybatis-generator-pom
2. 完整的 MyBatis-Generator 配置文件
参考链接:Notes: mybatis-generator-config
五、参考
- 掘金:MyBatis Generator 超详细配置
- 简书:Mybatis Generator完整配置详解
- MyBatis Generator 官网 ,关于更多配置的详情,建议查看官网的说明。
(完)如有问题,欢迎交流~
本文转载自: 掘金