# MyBatis教程 - 15 逆向工程

什么是逆向工程?

逆向工程就是通过数据库的表,生成对应的 Java 实体类、Mapper接口、 XML 映射文件,这样的话就不用我们再去一个一个手动创建。


下面的操作,是在已经集成了 MyBatis 的环境中完成的,环境准备,参考 HelloWorld (opens new window)

这里我再建两种表,用来演示逆向工程:

CREATE TABLE tb_teacher (
  id INT NOT NULL AUTO_INCREMENT COMMENT 'ID',
  name varchar(64) NOT NULL COMMENT '老师名称',
  age tinyint unsigned DEFAULT NULL COMMENT '年龄',
  create_time datetime DEFAULT NULL COMMENT '创建时间',
	PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='老师表';

CREATE TABLE tb_course (
  id INT NOT NULL AUTO_INCREMENT COMMENT 'ID',
  name varchar(64) NOT NULL COMMENT '课程名称',
  create_time datetime DEFAULT NULL COMMENT '创建时间',
	PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='课程表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 1 添加依赖

在项目的 pom.xml 中添加依赖,需要添加插件依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- ...略 -->

    <dependencies>
        <!-- ...略 -->
    </dependencies>

    <build>
        <plugins>
            <!-- 逆向工程,生成mybatis代码插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.2</version>

                <!-- 插件的依赖 -->
                <dependencies>
                    <!-- mysql驱动依赖 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.22</version>
                    </dependency>

                    <!-- 逆向工程的核心依赖 -->
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.4.2</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 2 创建逆向工程配置文件

src/main/resources 目录下创建 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>
    <!--
        id: 生成器的唯一标识,自定义
        targetRuntime: 指定执行生成的逆向工程的版本
        MyBatis3Simple: 生成基本的CRUD,包括增删改查、和查询所有数据的5个方法,简洁版本
        MyBatis3: 生成很多的代码,以及基于 Example 对象的复杂查询方法
    -->
    <context id="myGenerator" targetRuntime="MyBatis3Simple">

        <commentGenerator>
            <!-- 是否去除自动生成的注释,因为生成的注释是英文的,所以这里不要注释 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 数据库的连接信息,连接到数据库才能生成 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/foooor_db?serverTimezone=UTC&amp;useSSL=false"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
           NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- javaBean的生成策略,指定要生成的pojo的位置-->
        <javaModelGenerator targetPackage="com.foooor.mybatis.pojo" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/><!-- 去除字段前后的空格 -->
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略 -->
        <sqlMapGenerator targetPackage="com.foooor.mybatis.mapper" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.foooor.mybatis.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 指定需要逆向工程的表,指定表名和对应的实体类名 -->
        <table tableName="tb_teacher" domainObjectName="Teacher" />
        <table tableName="tb_course" domainObjectName="Course" />
    </context>
</generatorConfiguration>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

上面主要指定的了生成的策略。

  • 在 win 系统写成 targetProject=".\src\main\resources" ,在 mac 系统写成 targetProject="./src/main/resources"
  • targetRuntime="MyBatis3Simple" 指定的是使用简单版本的生成策略,生成的接口仅包含 5 个方法,如果使用 MyBatis3 生成的方法会很多,主要是会生成 Example 对象,Example 对象是 QBC(Query By Criteria)的查询方式,根据一组条件来动态构建查询语句,举个栗子:
// 根据条件查询
TeacherExample example = new TeacherExample();
// 查询条件或者更新条件
example.createCriteria().andNameEqualTo("王老师").andAgeEqualTo(35);
1
2
3
4

使用 targetRuntime="MyBatis3" 会为每个实体类生成 XxxExample 对象,通过 XxxExample 对象构建查询语句。使用这种方式会生成很多的方法,包含各种条件。

我自己不是很喜欢这种方式,感觉还不如 MyBatis-Plus 方便,如果需要,你可以试试看看。


另外在上面生成的配置文件中,指定了各个表的名称,如果想针对所有的表生成,可以使用 * 指定。

<table tableName="*" />
1

# 3 测试生成

在 pom.xml 中添加完逆向工程的插件,会在 Maven 下的插件中,多出 mybatis-generator 选项,直接双击执行生成即可。

执行完成, 会在对应的包下生成 实体类对象Mapper接口Mapper 的SQL映射文件。