Mybatis之Mybatis Generator vs IDEA插件 自动生成代码
Mybatis系列文章
Mybatis之配置详解
Mybatis之XML 映射器详解
Mybatis之动态 SQL详解
Mybatis之缓存详解
Mybatis之映射器注解详解
Mybatis之Mybatis Generator vs IDEA插件 自动生成代码
前言
为了给大家对比Mybatis Generator和IDEA插件MyBatisCodeHelper-Pro究竟哪一个更好用,接下来会分别介绍怎么使用Mybatis Generator自动生成代码
以及如何使用MyBatisCodeHelper-Pro插件生成代码
。
Mybatis Generator xml配置文件
接下来主要讲解以下xml配置文件该如何配置,因为Mybatis Generator官网已经详细罗列出所有标签的用法以及解释,下面只详细介绍一些常用标签。下文中MyBatis Generator 用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>
<properties resource="mybatis-generator.properties" />
<classPathEntry location="${driverLocation}"/>
<context id="default" targetRuntime="MyBatis3" defaultModelType="conditional">
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="false"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${driverClass}"
connectionURL="${connectionURL}"
userId="${userId}"
password="${password}">
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="com.nestor.mybatisgeneratordemo.po"
targetProject="${baseTargetProject}/src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="false"/>
<property name="trimStrings" value="true"/>
<property name="immutable" value="false"/>
<property name="rootClass" value="com.nestor.mybatisgeneratordemo.po.BaseModel"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapper"
targetProject="${baseTargetProject}/src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.nestor.mybatisgeneratordemo.mapper"
targetProject="${baseTargetProject}/src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<table tableName="%" schema="root">
<generatedKey column="id" sqlStatement="MySql" identity="true" type="post"/>
</table>
</context>
</generatorConfiguration>
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元素的子元素。
包含以下子元素(有严格的顺序):
<properties> (0个或1个)
<classPathEntry> (0个或多个)
<context> (1个或多个)
3.1 properties 元素
这个元素用来指定外部的属性元素,不是必须的元素。
元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}这种形式的引用,通过这种方式引用属性文件中的属性值。
<properties resource="mybatis-generator.properties" />
这个属性可以通过resource
或者url
来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错。
resource:指定classpath下的属性文件,使用类似com/myproject/generatorConfig.properties这样的属性值。
url:可以指定文件系统上的特定位置,例如file:///C:/myfolder/generatorConfig.properties
3.2 classPathEntry 元素
这个元素可以0或多个,不受限制。
最常见的用法是通过这个属性指定驱动的路径,例如:
<classPathEntry location="D:/maven/repository/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar"/>
注意,classPathEntry只在下面这两种情况下才有效:
- 当加载 JDBC 驱动内数据库时,常用场景:使用命令行进行Mybatis代码自动生成时,下文中会详细介绍。
- 当加载根类中的 JavaModelGenerator 检查重写的方法时。
3.3 context 元素
在MBG的配置中,至少需要有一个<context>元素。
<context>元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的<context>。
该元素只有一个必选属性id,用来唯一确定一个<context>元素,该id属性可以在运行MBG的使用。
此外还有几个可选属性:
defaultModelType
:这个属性很重要,这个属性定义了MBG如何生成实体类。
这个属性有以下可选值:
- conditional:这是默认值,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
- flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。这种模型最简单,推荐使用。
- hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime
:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:
- MyBatis3:默认值
- MyBatis3Simple:不生成和Example查询有关的内容
- Ibatis2Java2:基于Ibatis2生成
- Ibatis2Java5:基于Ibatis2生成
一般情况下,我们使用如下的配置即可:
<context id="default" targetRuntime="MyBatis3" defaultModelType="conditional">
<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.1 property 元素
下面看看支持的属性:autoDelimitKeywords、beginningDelimiter、endingDelimiter、javaFileEncoding
、javaFormatter、xmlFormatter
首先是autoDelimitKeywords
,当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加分隔符。
beginningDelimiter
和endingDelimiter
的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为反单引号(`),配置如下:
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
属性javaFileEncoding
设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
最后两个javaFormatter
和xmlFormatter
属性可能会很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定这两个属性的值来实现。
3.3.2 plugin 元素
该元素可以配置0个或者多个,不受限制。
<plugin>元素用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
3.3.3 commentGenerator 元素
该元素最多可以配置1个。
这个元素非常有用,相信很多人都有过这样的需求,就是希望MBG生成的代码中可以包含注释信息,具体就是生成表或字段的备注信息。
该元素有一个可选属性type
,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口。而且必有一个默认的构造方法。这个属性默认值是使用实现类org.mybatis.generator.internal.DefaultCommentGenerator。
默认的实现类中提供了两个可选属性,需要通过属性进行配置。suppressAllComments
:阻止生成注释,默认为false。suppressDate
:阻止生成的注释包含时间戳,默认为false。
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会提交,因而一般情况下我们都会屏蔽日期注释信息,可以如下配置:
<commentGenerator>
<property name="suppressAllComments" value="false"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
可以自己实现个类名为MyCommentGenerator,在你自己的实现类中,你可以选择是否继续支持上面的两个属性,你还可以增加对其他属性的支持。
<commentGenerator type="com.nestor.mybatisgeneratordemo.common.MyCommentGenerator">
3.3.4 jdbcConnection 元素
<jdbcConnection>用于指定数据库连接信息,该元素必选,并且只能有一个。
配置该元素只需要注意如果JDBC驱动不在classpath下,就需要通过<classPathEntry>元素引入jar包,这里推荐将jar包放到classpath下。
该元素有两个必选属性:driverClass
:访问数据库的JDBC驱动程序的完全限定类名。connectionURL
:访问数据库的JDBC连接URL。
该元素还有两个可选属性:userId
:访问数据库的用户ID。password
:访问数据库的密码。
这个元素配置起来最容易,这里举个简单例子:
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password="">
</jdbcConnection>
3.3.5 javaTypeResolver 元素
该元素最多可以配置一个。这个元素的配置用来指定JDBC类型和Java类型如何转换。
该元素提供了一个可选的属性type,和比较类型,提供了默认的实现DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性。
<property>可以配置的属性为forceBigDecimals
,该属性可以控制是否强制DECIMAL
和NUMERIC
类型的字段转换为Java类型的java.math.BigDecimal,默认值为false,一般不需要配置。
默认情况下的转换规则为:
- 如果精度>0或者长度>18,就会使用java.math.BigDecimal
- 如果精度=0并且10<=长度<=18,就会使用java.lang.Long
- 如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
- 如果精度=0并且长度<5,就会使用java.lang.Short
- 如果设置为true,那么一定会使用java.math.BigDecimal
可以配置的属性为useJSR310Types
,该属性可以控制是否强制DATE
和DATETIME
类型的字段转换为Java8的LocalDate
和LocalDateTime
,默认值为false。
配置示例如下:
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>
3.3.6 javaModelGenerator 元素
该元素必须配置一个,并且最多一个。该元素用来控制生成的实体类,根据中配置的defaultModelType,一个表可能会对应生成多个不同的实体类。一个表对应多个类实际上并不方便,所以前面也推荐使用flat,这种情况下一个表对应一个实体类。
该元素只有两个属性,都是必选的。targetPackage
:生成实体类存放的包名。targetProject
:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject=“src/main/java”)。
该元素支持以下几个<property>子元素属性:
- 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。
配置示例如下:
<javaModelGenerator targetPackage="com.nestor.mybatisgeneratordemo.po"
targetProject="${baseTargetProject}/src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="false"/>
<property name="trimStrings" value="true"/>
<property name="immutable" value="false"/>
<property name="rootClass" value="com.nestor.mybatisgeneratordemo.po.BaseModel"/>
</javaModelGenerator>
3.3.7 sqlMapGenerator 元素
该元素可选,最多配置一个。但是有如下两种必选的特殊情况:
如果targetRuntime目标是iBATIS2,该元素必须配置一个。
如果targetRuntime目标是MyBatis3,只有当<javaClientGenerator>需要XML时,该元素必须配置一个。 如果没有配置<javaClientGenerator>,则使用以下的规则:如果指定了一个<sqlMapGenerator>,那么MBG将只生成XML的SQL映射文件和实体类。如果没有指定<sqlMapGenerator>,那么MBG将只生成实体类。
该元素只有两个属性都是必选的。targetPackage
:生成实体类存放的包名,一般就是放在该包下。targetProject
:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject=“src/main/resources”)。
该元素支持<property>子元素,只有一个可以配置的属性:
enableSubPackages
:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false。
配置示例:
<sqlMapGenerator targetPackage="mapper"
targetProject="${baseTargetProject}/src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
3.3.8 javaClientGenerator 元素
该元素可选,最多配置一个。如果不配置该元素,就不会生成Mapper接口。
该元素有3个必选属性:
type
:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必选有一个默认的构造方法。 该属性提供了以下预定的代码生成器,首先根据的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接口
targetPackage
:生成实体类存放的包名,一般就是放在该包下。
targetProject
:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject=“src/main/java”)。
该元素还有一个可选属性:
implementationPackage
:如果指定了该属性,实现类就会生成在这个包中。
该元素支持子元素设置的属性:enableSubPackages、exampleMethodVisibility、methodNameCalculator、rootInterface、useLegacyBuilder。
这几个属性不太常用,具体作用请看Mybatis Generator官网。
配置示例:
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.nestor.mybatisgeneratordemo.mapper"
targetProject="${baseTargetProject}/src/main/java">
<property name="enableSubPackages" value="false"/>
<!--<property name="rootInterface" value="com.nestor.mybatisgeneratordemo.mapper.BaseMapper"/>-->
</javaClientGenerator>
3.3.9 table 元素
该元素至少要配置一个,可以配置多个。该元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。
该元素有一个必选属性:
tableName
:指定要生成的表名,可以使用SQL通配符匹配多个表。
例如要生成全部的表,可以按如下配置:
<table tableName="%" />
该元素包含多个可选属性:
schema
:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。catalog
:数据库的catalog,如果设置了该值,生成SQL的表名会变成如catalog.tableName的形式。
alias
:如果指定,这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式。domainObjectName:
生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。enableXXX
:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。selectByPrimaryKeyQueryId
:DBA跟踪工具会用到,具体请看详细文档。selectByExampleQueryId
:DBA跟踪工具会用到,具体请看详细文档。modelType
:和的defaultModelType含义一样,这里可以针对表进行配置,这里的配置会覆盖的defaultModelType配置。escapeWildcards
:这个属性表示当查询列,是否对schema和表名中的SQL通配符 (’_’ and ‘%’) 进行转义。 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false。delimitIdentifiers
:是否给标识符增加分隔符。默认false。当catalog,schema或tableName中包含空白时,默认为true。delimitAllColumns
:是否对所有列添加分隔符。默认false。
该元素包含多个可用的<property>子元素,可选属性为:
constructorBased
:和中的属性含义一样。
ignoreQualifiersAtRuntime
:生成的SQL中的表名将不会包含schema和catalog前缀。
immutable
:和中的属性含义一样。
modelOnly
:此属性用于配置是否为表只生成实体类。如果设置为true就不会有Mapper接口。如果配置了,并且modelOnly为true,那么XML映射文件中只有实体对象的映射元素()。如果为true还会覆盖属性中的enableXXX方法,将不会生成任何CRUD方法。
rootClass
:和中的属性含义一样。
rootInterface
:和中的属性含义一样。
runtimeCatalog
:运行时的catalog,当生成表和运行环境的表的catalog不一样的时候可以使用该属性进行配置。
runtimeSchema
:运行时的schema,当生成表和运行环境的表的schema不一样的时候可以使用该属性进行配置。
runtimeTableName
:运行时的tableName,当生成表和运行环境的表的tableName不一样的时候可以使用该属性进行配置。
selectAllOrderByClause
:该属性值会追加到selectAll方法后的SQL中,会直接跟order by拼接后添加到SQL末尾。
useActualColumnNames
:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。 如果为false(默认值),MGB将会尝试将返回的名称转换为驼峰形式。 在这两种情况下,可以通过 元素显示指定,在这种情况下将会忽略这个(useActualColumnNames)属性。
useColumnIndexes
:如果是true,MBG生成resultMaps的时候会使用列的索引,而不是结果中列名的顺序。
useCompoundPropertyNames
:如果是true,那么MBG生成属性名的时候会将列名和列备注接起来。
<table>还包含以下子元素:
- <generatedKey> (0个或1个),这个元素用来指定自动生成主键的属性。MBG在生成insert的SQL映射文件中插入一个元素。 这个元素非常重要。
- <columnRenamingRule> (0个或1个)。使用该元素可以在生成列之前,对列进行重命名。这对那些存在同一前缀的字段想在生成属性名时去除前缀的表非常有用。
- <columnOverride> (0个或多个)。该元素从将某些属性默认计算的值更改为指定的值。
- <ignoreColumn> (0个或多个)。该元素可以用来屏蔽不需要生成的列。
Mybatis Generator 实战
引入maven依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
添加配置文件
generatorConfig.xml
<?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>
<properties resource="mybatis-generator.properties" />
<classPathEntry location="${driverLocation}"/>
<context id="default" targetRuntime="MyBatis3" defaultModelType="conditional">
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!--不合并 mapper.xml,直接覆盖,不加的话多次执行会生成重复的xml语句-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<!--自定义插件-->
<plugin type="com.nestor.mybatisgeneratordemo.common.MyToStringPlugin" />
<plugin type="com.nestor.mybatisgeneratordemo.common.BaseMapperGeneratorPlugin">
<property name="baseMapper" value="com.nestor.mybatisgeneratordemo.mapper.BaseMapper" />
</plugin>
<commentGenerator type="com.nestor.mybatisgeneratordemo.common.MyCommentGenerator">
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="false"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${driverClass}"
connectionURL="${connectionURL}"
userId="${userId}"
password="${password}">
<!--指定使用数据库连接里的库信息-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="com.nestor.mybatisgeneratordemo.po"
targetProject="${baseTargetProject}/src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="false"/>
<property name="trimStrings" value="true"/>
<property name="immutable" value="false"/>
<property name="rootClass" value="com.nestor.mybatisgeneratordemo.po.BaseModel"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapper"
targetProject="${baseTargetProject}/src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.nestor.mybatisgeneratordemo.mapper"
targetProject="${baseTargetProject}/src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<table tableName="grade_param" domainObjectName="GradeParam">
<generatedKey column="id" sqlStatement="MySql" identity="true" type="post"/>
<columnOverride column="level" javaType="com.nestor.mybatisgeneratordemo.enums.GradeLevel"/>
</table>
<table tableName="student" domainObjectName="Student">
<generatedKey column="id" sqlStatement="MySql" identity="true" type="post"/>
<columnOverride column="sex" javaType="com.nestor.mybatisgeneratordemo.enums.Sex"/>
</table>
<table tableName="school" domainObjectName="School">
<generatedKey column="id" sqlStatement="MySql" identity="true" type="post"/>
</table>
</context>
</generatorConfiguration>
在我的个性配置中可以看到,我使用了自定义插件,MyToStringPlugin主要是为我们的model类生成我们自定义toString方法。BaseMapperGeneratorPlugin主要是让自动生成的mapper接口都继承于我们自定义的BaseMapper接口,同时在自动生成代码时,保留接口中已定义方法。MyCommentGenerator帮助生成实体类注释的插件。具体源码就不贴出来了,有兴趣的小伙伴可以去github工程中查看。
mybatis-generator.properties
driverLocation=D:/maven/repository/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar
driverClass=com.mysql.cj.jdbc.Driver
connectionURL=jdbc:mysql://localhost:3306/mybatis-demo?useUnicode=true&characeterEncoding=utf-8&serverTimezone=UTC
userId=root
password=123456
baseTargetProject=D:/IdeaProjects/mybatis-demos/mybatis-generator-demo
运行Mybatis Generator的方式
这里主要介绍常用的三种方式:JAVA启动类,maven插件,命令行
JAVA启动类
添加MybatisJavaGenerator java类直接执行main方法即可。
public class MybatisJavaGenerator {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(
MybatisJavaGenerator.class.getResourceAsStream("/generatorConfig.xml"));
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
注意点:在使用JAVA启动类方式自动生成代码时,需要在generatorConfig.xml配置targetProject时需要指定磁盘路径(例:D:/IdeaProjects/mybatis-demos/mybatis-generator-demo/src/main/java)以及需要在generatorConfig.xml中指定classPathEntry,否则会找不到驱动的jar包。
maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!-- 在控制台打印执行日志 -->
<verbose>true</verbose>
<!-- 重复生成时会覆盖之前的文件-->
<overwrite>true</overwrite>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<!-- 数据库连接选择8.0以上的,因为用的mysql8.0-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
执行maven install就会自动生成model、mapper、xml。
注意点:使用maven插件时,使用自定义插件时就需要将对应引用的插件代码单独打包发布到maven,再在pom文件引用并在<build>中也配置,否者无法通过install方式自动生成代码。无需要在generatorConfig.xml中指定classPathEntry。
命令行
打开mybatis-generator-core-x.x.x.jar所在文件夹,在命令窗口执行下面命令,注意:与mybatis-generator-core-x.x.x.jar不在同一目录下,需要指定generatorConfig.xml的路径
java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml -overwrite
注意点:需要在generatorConfig.xml中指定classPathEntry,否则会找不到驱动的jar包。
IDEA插件
IDEA中有很多关于mybatis generator自动生成代码相关插件,可以通过搜索mybatis关键字来查找。这里主要介绍一下Free MyBatis plugin和MyBatisCodeHelper-Pro。
Free MyBatis plugin
免费的mybatis自动生成代码IDEA插件。
- 连接上IDEA自带的Database
- 选中想要自动生成代码的表,然后右击选择mybatis-generator。点击确定出现以下窗口。
- 选择对应需要存放model、mapper、xml的路径。点击确定就会自动生成。
MyBatisCodeHelper-Pro
收费的mybatis自动生成代码IDEA插件,但是功能强大而且收费也不贵几十块一年,具有mybatis的补全、检测、跳转、代码生成等功能,了解具体详情或者具体操作步骤可以看插件的文档
以下介绍两种比较常用的自动生成代码方式。
通过model生成
- 找到定义好的model,alt+insert组合键,弹出弹框选择generate mybatis files
- 选择new myabtis file,出现以下弹框
- 选择对应需要存放model、mapper、xml、sql的路径。点击确定就会自动生成。
通过数据库table生成
这种方式与上面Free MyBatis plugin插件生成的方式类似。
- 选择表,然后右击选择Mybatis generator或者Mybatis multiple table generate都可以,一个针对于单表,一个针对于多表。
- 选择对应需要存放model、mapper、xml的路径。点击确定就会自动生成。
一个自动生成代码的规范
无论我们使用哪种方式,不管是通过代码还是IDEA插件,都要保证自动生成的代码与我们自定义的代码分离开,防止下次生成覆盖之前自己自定义的代码。建议分别创建如下目录。
从图中看出红框选中的editable
包下的部分是我们自定义的一些sql放置的xml,而它的外层是代码自动生成的一些xml。同样mapper接口也可以建一个editable包,存放自定义接口,但是要保证editable的xml使用的是editable下mapper的namespace。
在我示例的github工程中因为不想单独定义editable mapper接口就写了BaseMapperGeneratorPlugin,把自动生成的方法都放在BaseMapper中,自定义的方法就可以放在对应的mapper中。
因为BaseMapperGeneratorPlugin插件支持保留自定义方法所以不用多次自动生成担心自定义方法丢失的问题。示例里面我也是给xml单独创建了一个editable包,不同的是外层的xml和editable包下的两个mapper.xml使用的是同一个namespace。
总结
针对Mybatis Generator通过代码实现自动生成和IDEA插件这两种方式体验下来看,针对快速构建项目,针对表结构修改不频繁或者不迭代的项目来说,使用IDEA插件来生成更方便,更迅速,无需引入依赖以及编写代码。但是如果是针对长久项目迭代,表结构经常变更的话,还是更建议Mybatis Generator代码实现。
github工程地址:https://github.com/nestorbian/spring-boot-examples/tree/master/mybatis-generator-demo
Mybatis系列文章
Mybatis之配置详解
Mybatis之XML 映射器详解
Mybatis之动态 SQL详解
Mybatis之缓存详解
Mybatis之映射器注解详解
Mybatis之Mybatis Generator vs IDEA插件 自动生成代码
参考:
MyBatis Generator官网
MyBatis Generator 详解
MyBatisCodeHelper-Pro官网