MyBatis Generator 使用笔记
利用mybatis-generator-maven-plugin自动生成数据库映射代码。
MyBatis Generator 官方文档
http://www.mybatis.org/generator/index.html
MyBatis Generator最佳实践
https://www.jianshu.com/p/9f727f23f3bc
mybatis-generator-maven-plugin
Running MyBatis Generator With Maven
https://mybatis.org/generator/running/runningWithMaven.html
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<!-- MyBatis Generator配置文件位置, ${basedir}/src/main/resources/generatorConfig.xml -->
<!-- <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>-->
<!-- 是否覆盖生成的Java文件, overwrite选项只能让java文件被覆盖,xml永远是merge追加,不可配置为overwrite -->
<overwrite>true</overwrite>
<!-- 生成过程中是否输出详细信息 -->
<verbose>true</verbose>
</configuration>
<!-- 添加mysql-connector-java依赖后就不需要在mybatis配置文件中用classPathEntry手动指定驱动位置了 -->
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>com.qiukeke</groupId>
<artifactId>mybatis-generator-limit-plugin</artifactId>
<version>1.0.4</version>
</dependency>
<dependency>
<groupId>com.softwareloop</groupId>
<artifactId>mybatis-generator-lombok-plugin</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</plugin>
mybatis-generator-maven-plugin配置项
configurationFile
指定 MyBatis Generator XML 配置文件的位置,默认值是 ${basedir}/src/main/resources/generatorConfig.xml
overwrite
是否覆盖生成的Java文件,注:overwrite 配置只影响java 类, xml 文件是不受这个控制的,xml永远是merge追加的,无法配置为overwrite ,默认值 falseverbose
生成过程中是否输出详细信息
mybatis-generator:generate
MyBatis Generator 只提供一个 goal mybatis-generator:generate
1、Idea中,在 Maven Projects 面板上点开 Plugins 中的 mybatis-generator 插件,双击运行其中的 mybatis-generator:generate goals 即可。
2、命令行通过 mvn 命令执行mvn mybatis-generator:generate
或mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
3、Eclipse中,在generatorConfig.xml上或工程上右键->Run As->Run Configuration->
Base directory:点击Browse Workspace选择本项目根目录
Goals 嵌入 mybatis-generator:generate
勾上Skip Tests;
然后点击run,即可运行MyBatis generator
RowBoundsPlugin 官方分页插件
官方提供的 RowBoundsPlugin 插件并不是真正的 sql 语句 limit offset, count
分页,而是先全部查出来,在java 代码中分页。
org.mybatis.generator.plugins.RowBoundsPlugin
http://mybatis.org/generator/reference/plugins.html
MyBatis Generator实现MySQL分页插件
http://xxgblog.com/2016/05/06/mybatis-generator-mysql-pagination/
mybatis-generator-limit-plugin 分页插件
单独的分页插件 MySQLLimitPlugin
wucao/mybatis-generator-limit-plugin
https://github.com/wucao/mybatis-generator-limit-plugin
分页插件 MySQLLimitPlugin 加 MySQLReplacePlugin 插件
wucao/mybatis-generator-mysql-plugin
https://github.com/wucao/mybatis-generator-mysql-plugin
上面两个原始作者的插件给出的 pluginRepository 都打不开了,下载不到插件依赖。
可以用下面这个,fork 后增加了对注解版 mapper 的支持,并且上传到了 maven 中央库
qiukeren/mybatis-generator-limit-plugin
https://github.com/qiukeren/mybatis-generator-limit-plugin
添加依赖
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>com.qiukeke</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
generatorConfig.xml 配置
<generatorConfiguration>
<context id="mysqlgenerator" targetRuntime="MyBatis3">
<plugin type="com.qiukeke.mybatis.plugins.MySQLLimitPlugin"></plugin>
...
</context>
</generatorConfiguration>
mybatis-generator-lombok-plugin lombok插件
softwareloop/mybatis-generator-lombok-plugin
https://github.com/softwareloop/mybatis-generator-lombok-plugin
添加依赖
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis.generator.version}</version>
<configuration>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>com.softwareloop</groupId>
<artifactId>mybatis-generator-lombok-plugin</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</plugin>
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>
<context id="example"
targetRuntime="MyBatis3Simple"
defaultModelType="flat">
<!-- include the plugin -->
<plugin type="com.softwareloop.mybatis.generator.plugins.LombokPlugin">
<!-- enable annotations -->
<property name="builder" value="true"/>
<!-- annotation's option(boolean) -->
<property name="builder.fluent" value="true"/>
<!-- annotation's option(String) -->
<property name="builder.builderMethodName" value="myBuilder"/>
<property name="accessors" value="true"/>
<!-- annotation's option(array of String) -->
<property name="accessors.prefix" value="m_, _"/>
<!-- disable annotations -->
<property name="allArgsConstructor" value="false"/>
</plugin>
<!-- other configurations -->
</context>
</generatorConfiguration>
generatorConfig.xml配置项
此配置文件的作用是,告诉 MyBatis Generator
1、如何连接数据库?
2、生成的Model类,Mapper类,mapper.xml文件放到哪个目录下?
3、生成哪些表的mapper?
详见mybatis官方文档,配置文件中的每个字段都有详细的解释
MyBatis GeneratorXML Configuration File Reference
http://www.mybatis.org/generator/configreference/xmlconfig.html
generatorConfig.xml中不支持引用yml配置文件
注意 如果想通过 <properties resource="application.properties"/>
引用 spring 的配置项的话只能引用 .properties 配置文件。
generatorConfig.xml 只支持 .properties 格式配置文件,不支持 .yml 格式配置文件
自定义mapper名称
从 MyBatis Generator 1.3.4 版本开始, MBG 在 <table>
元素上提供了一个 mapperName
的属性,可以设置生成的 Mapper 名字,使用方法如下:
<table tableName="sys_store" mapperName="StoreDao">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
若不设置,默认 mapper 名为 模型 model名字 + Mapper
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>
<!--加载Spring Boot配置文件,为下面读取数据库信息准备-->
<properties resource="application.properties"/>
<!-- 数据库的JDBC驱动,换成自己的驱动位置 -->
<!-- mybatis-generator-maven-plugin添加mysql-connector-java依赖后就不需要在这里指定驱动了 -->
<!-- 建议将JDBC驱动放到项目的classpath下,而不是使用<classPathEntry>来引入jar包,主要考虑到所有开发人员的统一性。 -->
<!--<classPathEntry location="C:\Users\masi\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" />-->
<!-- 一个数据库一个context -->
<context id="blog" targetRuntime="MyBatis3">
<!-- 自动界定sql关键词 -->
<property name="autoDelimitKeywords" value="true"/>
<!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!--覆盖生成XML文件-->
<!-- mybatis-generator-maven-plugin 中的 overwrite选项只能让java文件被覆盖,xml永远是merge追加,不可配置为overwrite,mbg1.3.7新增的这个plugin可保证永远覆盖xml -->
<!-- http://mybatis.org/generator/reference/plugins.html -->
<!-- 如果使用 ANNOTATEDMAPPER 类型的 javaClientGenerator 即完全不需要xml文件,则完美解决此问题 -->
<!-- <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>-->
<!-- 分页插件 https://github.com/qiukeren/mybatis-generator-limit-plugin -->
<!-- <plugin type="org.mybatis.generator.plugins.MySQLLimitPlugin"/>-->
<!-- lombok 插件 https://github.com/softwareloop/mybatis-generator-lombok-plugin -->
<plugin type="com.softwareloop.mybatis.generator.plugins.LombokPlugin"/>
<!-- 在<commentGenerator>中,建议一定要保留suppressAllComments属性(使用默认值false),一定要取消时间戳suppressDate(设为true),避免在版本控制器中重复提交生成的代码。 -->
<commentGenerator>
<!-- 是否取消注释 -->
<property name="suppressAllComments" value="true"/>
<!-- 是否生成注释代时间戳-->
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库链接地址账号密码,读取 application.properties 中的配置 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="${spring.datasource.url}"
userId="${spring.datasource.username}"
password="${spring.datasource.password}">
<!-- MySQL 不支持 schema 或者 catalog 所以需要添加这个。使用8.x的 mysql-connector-java 时不加此项会出现读取到 information_schema 中的表 -->
<!-- 参考 : http://www.mybatis.org/generator/usage/mysql.html -->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成的Model实体类的存放位置 -->
<!-- java模型创建器,是必须要的元素
负责:1,key类(见context的defaultModelType);2,java类;3,查询类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<javaModelGenerator targetPackage="com.masikkk.blog.dao.model" targetProject="src/main/java">
<!-- 自动去掉字符类型数据的空白 -->
<!-- 当数据库字段使用CHAR时,建议在<javaModelGenerator>中设置<property name="trimStrings" value="true" />,可以自动去掉不必要的空格。 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成的Dao接口的存放位置 -->
<!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口
targetPackage/targetProject:同javaModelGenerator
type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
-->
<javaClientGenerator targetPackage="com.masikkk.blog.dao.client" targetProject="src/main/java"
type="ANNOTATEDMAPPER"/>
<!-- table可以有多个,库中的每个表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 -->
<!-- 用户表 -->
<table tableName="user" mapperName="MyUserMapper">
<property name="useActualColumnNames" value="false"/>
<!-- 数据库表主键 -->
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
<!-- 评论表 -->
<table tableName="comment">
<property name="useActualColumnNames" value="false"/>
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
问题
MBG给information_schema中的表生成了mapper和model
使用 8.x 版本的 mysql-connector-java 时,会出现 MBG 读取了 information_schema 中的表,比如 user 表,并给他生成了 model 和 mapper
解决方法:
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="${spring.datasource.url}"
userId="${spring.datasource.username}"
password="${spring.datasource.password}">
<!--MySQL 不支持 schema 或者 catalog 所以需要添加这个-->
<!--参考 : http://www.mybatis.org/generator/usage/mysql.html -->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
Catalogs and Schema
http://mybatis.org/generator/usage/mysql.html
表中有多余一个TEXT类型字段时自动生成WithBLOBS结尾的model
当表中有多余1个Text类型的字段时,mybatis-generator会生成WithBLOBS结尾的model文件并继承自愿表名model,同时具有带有text等类型字段的属性。
如果不想分为2个model,可以在mybatis-generator的配置文件中给text字段上加columnOverride
属性:
<table tableName="law_index_tag" domainObjectName="LawIndexTag">
<columnOverride column="title" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="content" javaType="java.lang.String" jdbcType="VARCHAR" />
</table>
这样所有字段都会再同一个model中了。
注意:只有当表中有多余一个text类型字段时mybatis-generator会这样处理,如果只有一个text字段,还是会生成到同一个model中。
Result Maps collection already contains value for
MyBatis配置的时候,出现
Result Maps collection already contains value for *
这个的问题
字面意思就是某某已经存在,这样的情况下Spring已经注入过一次,
其中有一种情况就是使用mybatisGenerator生成xml的时候,可能xml的内容不会被覆盖,而是追加到后面,导致xml里面有两份甚至更多的一样的内容,导致重复注入
mybatis generator 无法覆盖 mapper.xml
使用mybatis generator的时候遇到个问题,每次生成的mapper.xml都追加到同名文件中而不是覆盖
即使在 mybatis-generator-maven-plugin 插件中配置了 overwrite 选项也没用:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!-- MyBatis Generator配置文件位置 -->
<configurationFile>${basedir}/src/main/resources/mybatis-generator-config.xml</configurationFile>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
</configuration>
</plugin>
官方也说了 https://github.com/mybatis/generator/issues/196
The overwrite property is only used for generated Java files. It should not affect XML files at all. XML files should always be merged.
Have you configured a comment generator with suppressAllComment=true? If so, that would be the cause of this behavior. The XML merge won’t delete old elements if the comments are removed.
原来 overwrite 配置只影响java 类, xml 文件是不受这个控制的,xml永远是merge追加的,无法配置为overwrite
解决 mybatis-generator-maven-plugin 中 overwrite 配置无效的问题
https://segmentfault.com/a/1190000013038272
How could let MyBatis Generator overwriting the already generated *Mapper.xml?
https://stackoverflow.com/questions/43245041/how-could-let-mybatis-generator-overwriting-the-already-generated-mapper-xml
解决方法
(1) UnmergeableXmlMappersPlugin 插件
mybatis generator 1.3.7 版本中增加了一个plugin UnmergeableXmlMappersPlugin ,可解决这个问题
https://github.com/mybatis/generator/pull/311
官方的 plugin 中心也已有此插件:
http://www.mybatis.org/generator/reference/plugins.html
在 mybatis-generator-config.xml 中添加如下plugin
<context id="MyBatis" targetRuntime="MyBatis3" defaultModelType="flat">
<!--覆盖生成XML文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
...
</context>
解决mybatis generator无法覆盖XML
https://www.cnblogs.com/xxoome/p/10068780.html
(2)完全使用基于注解的 java 文件 mapper,不需要 xml 文件
元素类型为 “context” 的内容必须匹配…
使用 mybatis generator 生成代码时报错:
Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate (default-cli) on project blog: XML Parser Error on line 79: 元素类型为 "context" 的内容必须匹配 "(property*,plugin*,commentGenerator?,(connectionFactory|jdbcConnection),javaTypeResolver?,javaModelGenerator,sqlMapGenerator?,javaClientGenerator?,table+)"。
原因:context的属性配置要按照它给定的顺序来,就是上面报错的顺序:
property, plugin, commentGenerator?, jdbcConnection, javaTypeResolver?, javaModelGenerator, sqlMapGenerator?, javaClientGenerator?, table+
发现我把新添加的一个 plugin 放到 property 前面了,顺序不对导致报错,改过来就好了。
MyBatis入门教程(四):generator工具的使用
https://blog.csdn.net/Jalon2015/article/details/49422973
MyBatisCodeHelper-Pro
https://gejun123456.github.io/MyBatisCodeHelper-Pro/#/README
上一篇 2015年第四季度运动记录
下一篇 Java-日期时间
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: