官方网站:https://mybatis.org/generator/
通用 Mapper 的 MBG:https://github.com/abel533/Mapper/wiki/4.1.mappergenerator
参考:https://blog.youkuaiyun.com/q258523454/article/details/82292045
MyBatis Generator 简称 MBG,是 MyBatis 官方发布的代码生成器,它可以根据数据库的表生成对应的实体类,xml文件和mapper接口,提高开发效率,让开发者将更多的精力集中到业务上面。
如果我们使用了通用 Mapper,可以使用通用 Mapper 提供的 MBG,它对 MBG 进行了封装,生成的实体类可以配置包含 lombok 注解,mapper 接口继承通用 mapper 接口。
MBG 运行方式
这里只介绍 maven 插件方式,除了 maven 插件方式,还有 java 客户端方式,但是我决定这种不是业务方面的东西用代码实现感觉很突兀,即使放在 test 下也感觉不好。
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.1</version>
</plugin>
该插件包含一个 goal:mybatis-generator:generate
。
这个 goal 不会被 maven 自动执行,可以用命令 mvn mybatis-generator:generate
来运行,用命令方式的时候,可以传递参数,如 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
.
你也可以将 MBG 绑定到 maven 的生命周期中,但是并不推荐这么做。
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
如上示例将 MBG 插件绑定到 mavne 的 generate-sources
阶段,所以它会在 compile 之前执行。
配置参数概述
Parameter | Expression | Type | Comments |
---|---|---|---|
configurationFile | ${mybatis.generator.configurationFile} | java.io.File | XML 配置文件的位置,默认为 ${basedir}/src/main/resourcess/generatorConfig.xml |
contexts | ${mybatis.generator.contexts} | java.lang.String | 在当前运行中使用的以逗号分隔的上下文列表。列表中指定的任何 id 必须与 <context> 配置元素的 id 属性值完全匹配。只有在此列表中指定的 id 才会在此运行中处于活动状态。如果未指定此参数,则所有上下文都将处于活动状态 |
jdbcDriver | ${myabtis.generator.jdbcDriver} | java.lang.String | 数据库驱动类名 |
jdbcPassword | ${mybatis.generator.jdbcPassword} | java.lang.String | 数据库密码 |
jdbcURL | ${mybatis.generator.jdbcURL} | java.lang.String | 数据库的 url |
jdbcUserId | ${mybatis.generator.jdbcUserId} | java.lang.String | 数据库用户名 |
outputDirectory | ${mybatis.generator.outputDirectory} | java.io.File | MBG 生成的文件将被放置的目录。当配置文件中的 targetProject 属性被指定为 “MAVEN” 时会使用该目录,默认为:${project.build.directory}/generated-sources/mybatis-generator |
overwrite | ${mybatis.generator.overwrite} | boolean | 如果设置为 true,已经存在的 Java 文件会被覆盖,默认值为 false |
sqlScript | ${mybatis.generator.sqlScript} | java.lang.String | 在生成代码之前要运行的 sql 脚本,如果为 null,则不会执行任何脚本,如果设置了该值,则 jdbcDriver ,jdbcURL 也必须被提供,额外的,jdbcUserId 和 jdbcPassword 也要被提供如果数据库要求身份验证的话 |
tableNames | ${mybatis.generator.tableNames} | java.lang.String | 如果指定,则这是在当前运行中使用的以逗号分隔的表名列表。列表中指定的任何表都必须与 <table>\ 配置元素中指定的完全限定名完全匹配。只有在此列表中指定的表才会在此运行中处于活动状态。如果未指定此参数,则所有表都将处于活动状态。可以指定为 table,schema.table,catalog.table 等 |
verbose | ${mybatis.generator.verbose} | boolean | 如果为 true,MBG 将会输出程序信息到日志中 |
includeCompileDependencies | ${mybatis.generator.includeCompileDependencies} | boolean | 如果为 true,scope 为 “compile”,“provided” 和 “system” 的依赖将会被添加到生成器的类路径中 |
includeAllDependencies | ${mybatis.generator.iincludeAllDependencies} | boolean | 如果为 true,所有 scope 类型的依赖都会被添加到生成器的类路径中 |
MBG 配置
配置文件头
<?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">
<generatorConfiguration>
<!-- 具体配置内容 -->
</generatorConfiguration>
配置介绍
<generatorConfiguration>
<!--添加属性文件,一般为数据库连接属性文件,不是必须的,在使用spring框架是数据库交给spring管理,所以该属性一般用不到-->
<properties resource=""></properties>
<!--指定驱动类路径,当驱动类不在 classpath 下时才有用,所以一般用不到-->
<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>
<!--至少有一个该元素,可以配置多个,表示生成器上下文,在通过 maven 插件运行的时候可以通过 id 指定运行哪个上下文
可配置的属性:
defaultModelType,该属性定义 MBG 如何生成实体类
conditional:这是默认值,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。
因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**
hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,
则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime,此属性用于指定生成的代码的运行时环境
MyBatis3:*这是默认值*
MyBatis3Simple:如果你希望不生成和Example查询有关的内容,设置该值
Ibatis2Java2
Ibatis2Java5 一般情况下使用默认值即可,有关这些值的具体作用以及区别请查看中文文档的详细内容。
introspectedColumnImpl,该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn该类的实现类,一般用不到
-->
<context id="default" defaultModelType="flat" targetRuntime="MyBatis3Simple">
<!--当表名或者字段名为 SQL 关键字的时候,可以设置该属性为 true,MBG会自动给表名或字段名添加**分隔符**-->
<property name="autoDelimitKeywords" value="true"/>
<!--指定分隔符,在 mysql 中为反单引号-->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到-->
<property name="javaFileEncoding" value="UTF8"/>
<!--下面两个属性在要使用模板来定制生成的java文件和xml文件的样式时,才有用-->
<property name="javaFormatter" value=""/>
<property name="xmlFormatter" value=""/>
<!--该元素用来定义一个插件。插件用于扩展或修改通过 MyBatis Generator (MBG) 代码生成器生成的代码,
插件将按在配置中配置的顺序执行-->
<plugin type=""></plugin>
<!--MBG 的注释配置,可以修改 MBG默认的注释配置,也可以自定义注释配置
该元素有一个可选属性 type,该属性用于指定生成注释的实现类,该实现类要实现 `org.mybatis.generator.api.CommentGenerator` 接口
默认实现是 `org.mybatis.generator.internal.DefaultCommentGenerator`
默认实现提供了两个可选属性:
suppressAllComments:**阻止**生成注释,默认为false
suppressDate:**阻止**生成的注释包含时间戳,默认为false
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用**版本控制**的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息-->
<commentGenerator>
<!--屏蔽默认实现的注释信息-->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!--该元素用于配置连接数据库信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="123">
<!--生成指定数据库下的所有表,在 mysql 中,如果 table 标签的 tableName 为 % 表示所有表,如果不设置下面设置会生成所有数据库的所有表-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!--这个元素的配置用来指定JDBC类型和Java类型如何转换,提供了默认的实现 DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性-->
<javaTypeResolver></javaTypeResolver>
<!--实体类生成设置
targetPackage:生成实体类存放的包名
targetProject:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject="src/main/java")-->
<javaModelGenerator targetPackage="com.monkey.domain" targetProject="src/main/java">
<!--该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false。-->
<property name="constructorBased" value=""/>
<!--如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false-->
<property name="enableSubPackages" value=""/>
<!--该属性用来配置实体类属性是否可变,如果设置为true,那么constructorBased不管设置成什么,都会使用构造方法入参,
并且不会生成setter方法。如果为false,实体类属性就可以改变。默认为false。-->
<property name="immutable" value=""/>
<!--设置所有实体类的基类-->
<property name="rootClass" value="com.monkey.domain.BaseEntity"/>
<!--是否对数据库查询结果进行trim操作,如果设置为true就会生成类似这样
public void setUsername(String username) {this.username = username == null ? null : username.trim();}的setter方法。默认值为false-->
<property name="trimStrings" value=""/>
</javaModelGenerator>
<!--xml映射文件设置,如果没有配置,那么 MBG 将只生成实体类-->
<sqlMapGenerator targetPackage="com.monkey.mapper" targetProject="src/main/resources"></sqlMapGenerator>
<!--mapper接口配置,如果没有配置,就不会生成 Mapper 接口
type:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,
必须有一个默认的构造方法。 该属性提供了以下预定的代码生成器,
首先根据<context>的targetRuntime分成三类:
MyBatis3:
ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider注解方法会被XML替代。
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
MyBatis3Simple:
ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
Ibatis2Java2或**Ibatis2Java5**:
IBATIS:生成的对象符合iBATIS的DAO框架(不建议使用)。
GENERIC-CI:生成的对象将只依赖于SqlMapClient,通过构造方法注入。
GENERIC-SI:生成的对象将只依赖于SqlMapClient,通过setter方法注入。
SPRING:生成的对象符合Spring的DAO接口
implementationPackage:如果指定了该属性,实现类就会生成在这个包中
rootInterface:用于指定一个所有生成的接口都继承的父接口
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.monkey.mapper" targetProject="src/main/java"></javaClientGenerator>
<!--配置生成的表名,只有配置的才会生成实体类和其他文件
tableName:指定要生成的表名,可以使用SQL通配符匹配多个表-->
<table tableName="%"></table>
</context>
</generatorConfiguration>
通用 Mapper 专用代码生成器
使用专用代码生成器只需要在 MBG 配置文件中添加如下插件
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
<property name="forceAnnotation" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
</plugin>
插件配置介绍
mappers
这是最关键的参数,配置后生成的 Mapper 接口都会自动继承上该接口,如果你定义了一个自己的基础接口,例如:
package xxx.base;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 继承自己的MyMapper
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
//TODO
//FIXME 特别注意,该接口不能被扫描到,否则会出错
}
在配置插件时,可以配置为:
<property name="mappers" value="xxx.base.MyMapper"/>
caseSensitive
是否区分大小写,默认值 false
。如果数据库区分大小写,这里就需要配置为 true
,这样当表名为 USER
时,会生成 @Table(name = "USER")
注解,否则使用小写 user
时会找不到表。
forceAnnotation
是否强制生成注解,默认 false
,如果设置为 true
,不管数据库名和字段名是否一致,都会生成注解(包含 @Table
和 @Column
)
beginingDelimiter,endingDelimiter
开始和结束分隔符,对于关键字的情况下适用
usemapperCommentGenerator
是否使用通用 Mapper 提供的注释工具,默认 true
使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置 false
后会用默认的,或者你可以配置自己的注释插件
generateColumnConsts
在生成的 model 中,增加字段名的常量,便于使用 Example 拼接查询条件的时候调用
lombok
使用该功能版本号要在 4.2.1 以上
增加 model 代码生成时,可以直接生成 lombok 的 @Getter@Setter@ToString@Accessors(chain = true)
四类注解。
使用者在插件配置项中增加 <property name="lombok" value="Getter,Setter,ToString,Accessors" />
即可生成对应包含注解的 model 类。
插件配置
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>