Mybatis 逆向生成工具可以自动生成数据库表对应的实体类、mapper 接口以及对应的 xml 文件。

# 1、pom.xml 添加插件

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.7</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>Generate MyBatis Artifacts</id>
            <phase>package</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 允许移动生成的文件 -->
        <verbose>true</verbose>
        <!-- 是否覆盖 -->
        <overwrite>true</overwrite>
        <!-- 自动生成的配置 -->
        <configurationFile>generatorConfig.xml</configurationFile>
    </configuration>
</plugin>

# 2、项目根目录添加 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="testTables" targetRuntime="MyBatis3" defaultModelType="flat">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false: 否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/redpacket?serverTimezone=UTC" userId="root"
                        password="">
        </jdbcConnection>
        <!-- 默认 false,把 JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true 时把 JDBC DECIMAL 和
           NUMERIC 类型解析为 java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- targetProject: 生成 PO 类的位置 -->
        <javaModelGenerator targetPackage="com.huihui.redpacket.model"
                            targetProject="src/main/java">
            <!-- enableSubPackages: 是否让 schema 作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper 映射文件生成的位置
           如果 maven 工程只是单独的一个工程,targetProject="src/main/java"
           若果 maven 工程是分模块的工程,targetProject="所属模块的名称",例如:
           targetProject="ecps-manager-mapper",下同 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources">
            <!-- enableSubPackages: 是否让 schema 作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper 接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.huihui.redpacket.mapper"
                             targetProject="src/main/java">
            <!-- enableSubPackages: 是否让 schema 作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table tableName="t_red_packet" domainObjectName="RedPacket" mapperName="RedPacketMapper"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"
        >
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
        <table tableName="t_user_red_packet" domainObjectName="UserRedPacket" mapperName="UserRedPacketMapper"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"
        >
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
    </context>
</generatorConfiguration>

# 3、运行插件

mark

控制台打印 Build Success 即代表生成成功。

# 4、遇到的坑

自动生成的 Mapper 中只有 insert 方法和 insertSelective 方法。

# 5、解决方案

  1. 检查数据库中的表是否有主键。
  2. 检查 generatorConfig.xml 配置文件中的 table 标签是否把 enableSelectByPrimaryKey 等属性设为了 false,默认是 true。
  3. 检查使用的 mysql 驱动的版本,版本太高是无法生成的,本人使用的是 5.1.6 的版本。