MyBatis-Generator采坑记录

2,979 阅读7分钟

MyBatis-Generator可以根据数据库表结构自动在项目对应目录内创建Model(POJO、DO或PO 叫法不同,表达意思一致)、Mapper接口类和XXXMapper.xml文件
MyBatis Generator 官方文档 www.mybatis.org/generator/i…
mybatis-generator-maven-plugin mybatis.org/generator/r…

Maven插件mybatis-generator-maven-plugin

重要配置项

  • configurationFile 指定 MyBatis Generator XML 配置文件的位置,默认值是 ${basedir}/src/main/resources/generatorConfig.xml
  • overwrite 是否覆盖生成的Java文件,注:overwrite 配置只影响java 类, xml 文件是不受这个控制的,xml永远是merge追加的,无法配置为overwrite,默认值 false
  • verbose 生成过程中是否输出详细信息

pom配置

    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <!-- MyBatis generator 配置文件位置 -->
                    <configurationFile>src/main/resources/mybatis/GeneratorConfig.xml</configurationFile>
                    <!-- 生成过程中是否输出详细信息 -->
                    <verbose>true</verbose>
                    <!-- 允许覆盖生成的Java文件,overwrite选项只能让java文件被覆盖,xml永远是merge追加,不可配置为overwrite -->
                    <overwrite>true</overwrite>
                </configuration>
                <!-- 添加mysql-connector-java依赖后就不需要再mybatis配置文件中用classPathEntry手动指定驱动位置了 -->
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.7</version>
                    </dependency>

                    <dependency>
                        <groupId>org.mybatis</groupId>
                        <artifactId>mybatis</artifactId>
                        <version>3.4.6</version>
                    </dependency>

                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>6.0.6</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

运行命令mybatis-generator:generate

(generatorConfig配置较长,因此先介绍运行命令)MyBatis Generator 只提供一个 goal mybatis-generator:generate

  • Idea中,在 Maven Projects 面板上点开 Plugins 中的 mybatis-generator 插件,双击运行其中的 mybatis-generator:generate goals 即可。
  • 命令行通过 mvn 命令执行
mvn mybatis-generator:generate

mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate

配置文件 generatorConfig.xml

作用

  • 如何连接数据库
  • 生成Model(POJO、DO或PO 叫法不同,表达意思一致)、Mapper接口类和XXXMapper.xml文件对应目录
  • 生成哪些表的mapper文件

注意事项

GeneratorConfig无法引用.yml配置文件?

原因:generatorConfig.xml中不支持引用yml配置文件,必须引用.properties配置文件,可以自定义,不需要是application.properties

mybatis-generator:generate执行时报驱动mysql-connector-java找不到

原因:classpathEntry标签可选,为数据库的JDBC驱动,需替换成自己本地驱动地址,mybatis-generator-maven-plugin添加mysql-connector-java 依赖后就不需要在这里指定驱动了,建议使用这种方式

mybatis generator 无法覆盖 mapper.xml或者UnmergeableXmlMappersPlugin插件找不到

原因:mybatis-generator-maven-plugin 中的 overwrite选项只能让java文件被覆盖,xml永远是merge追加,不可配置为overwrite,mbg1.3.7新增的这个plugin(org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin)可保证永远覆盖xml,使用1.3.5或者1.3.3会找不到该插件

mybatis generator 无法覆盖 mapper.xml

原因:javaClientGenerator标签下的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

具体配置

各配置含义已在注释中标明更详细的配置可参考http://www.mybatis.org/generator/configreference/xmlconfig.html

<?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文件,不能读取yml文件   -->
<!--    <properties resource="application.properties">-->
<!-- 执行generator插件生成文件的命令:mvn mybatis-generator:generate -->
<!-- classpathEntry 可选,为数据库的JDBC驱动,需替换成自己本地驱动地址,mybatis-generator-maven-plugin添加mysql-connector-java
依赖后就不需要在这里指定驱动了,建议使用这种方式
 -->
<!--    <classPathEntry-->
<!--            location="/Users/kk/.m2/repository/mysql/mysql-connector-java/5.1.46/mysql-connector-java-5.1.46
.jar"/>-->

    <!-- 一个数据库一个context -->
    <context id="mysqlTables" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- 自动界定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文件,则完美解决此问题,mybatis-generator-maven-plugin版本需要为1.3
        .7或以上,1.3.2和1.3.5均会报找不到该插件 -->
        <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 中的配置,如果没有设置properties格式的配置就需要在这里配置,在xml中写&,会因为未转义而报错要将&写成&amp; -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull&amp;useUnicode=true&amp;characterEncoding=utf-8
    &amp;serverTimezone=Asia/Shanghai&amp;useSSL=false"
            userId="root"
            password="root">
            <!-- MySQL 不支持 schema 或者 catalog 所以需要添加这个。使用8.x的 mysql-connector-java 时不加此项会出现读取到 information_schema 中的表 -->
            <!-- 参考 : http://www.mybatis.org/generator/usage/mysql.html -->
            <!--            <property name="nullCatalogMeansCurrent" value="true"/>-->
        </jdbcConnection>

        <!-- 指定生成的类型为java类型,避免数据库中number等类型字段,是否使用bigDecimal,false可自动转化为其他类型(Long、Integer、Short等) -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成model模型,对应的包,存放位置可以指定具体的路径,如/ProjectName/src,也可以使用MyWebservice/src/main/java来自动生成
        负责:1,key类(见context的defaultModelType);2,java类;3,查询类
        targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
        targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
        -->
        <javaModelGenerator targetPackage="com.kk.domain.entity.DO"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimString" value="true"></property>
        </javaModelGenerator>

        <!--对应的xml mapper文件  -->
        <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 对应的mapper接口(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 type="ANNOTATEDMAPPER" targetPackage="com.kk.domain.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- tables 配置好表名和对应的实体对象名  maven命令为:mybatis-generator:generate-->
        <table tableName="t_order" domainObjectName="OrderDO"
               enableCountByExample="false" enableUpdateByExample="false"
               enableSelectByExample="true" enableDeleteByExample="false"
               selectByExampleQueryId="true">
            <property name="useActualColumnNames" value="false"/>
        </table>
    </context>
</generatorConfiguration>

示例代码

mybatis-generator-demo 下的db-mysql-mabits