当前位置 : 首页 » 文章分类 :  开发  »  MyBatis Generator 使用笔记

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 ,默认值 false
verbose 生成过程中是否输出详细信息

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-日期时间

阅读
评论
3.8k
阅读预计18分钟
创建日期 2015-08-25
修改日期 2019-12-28
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论