# MyBatis 逆向生成工具

  • MyBatisGenerator:my batis 官方提供的生成器

    去官网文档中查看,就有该说明,使用上也是引用他的生成器包,编写配置文件,使用生成器按配置文件进行生成代码。

    这里笔者有时间再补上官方的连接

  • TkMapper (opens new window) 通用 Mapper

    官方有中文文档的,比较容易使用,对原生的生成器有一些改进(应该是对原生的一些自定义的进行了实现定制),因为在使用方式和配置文件内容上几乎一样。

    通用 mapper 拓展了官方的 mapper 使用方式,比如单表查询上的使用体验等。

此工具地址 (opens new window) 注意,该项目不是子模块,是一个独立的项目,需要单独用 idea 打开使用

单独封装成项目,可能是为了不让生成相关的代码出现在正式项目中吧。

笔者就封装成了一个单独的 jar,在项目中引用该 jar 包,然后写个测试方法把配置文件地址传进去,完成生成的。指向的包名配置和路径就在当前的项目中,可以直接覆盖掉,不用来回复制了

大体实现如下:

增加项目依赖

<?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">
    <groupId>cn.mrcode.mybatis.tkmappter.generator</groupId>
    <artifactId>mybatis-generator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- 打印日志,生成的时候可以输出列信息等 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.11</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.11</version>
        </dependency>

        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
        </dependency>
        <!-- mybatis 逆向生成工具  -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <!-- tkmapper 生成器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>
</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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

配置 logback.xml ,可以打印生成信息,不然出错都不知道是哪里的问题

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制台输出 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
                %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 日志输出级别 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

创建 tkmapper 生成时所需要的一个接口


package cn.mrcode.foodiedev.my.mapper;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 继承自己的 MyMapper
 */
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}

1
2
3
4
5
6
7
8
9
10
11
12

创建 tkmapper 生成类,其实这里的生成方式 mybatis 官方原生的生成代码,tkmapper 只是提供了其中的一些插件来达到生成符合 tkmapper 框架的代码

package cn.mrcode.mybatis.tkmappter.generator;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


public class GeneratorDisplay {

    public void generator() throws Exception {

        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        //指定 逆向工程配置文件
        File configFile = new File("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                callback, warnings);
        myBatisGenerator.generate(null);

    }

    public static void main(String[] args) throws Exception {
        try {
            GeneratorDisplay generatorSqlmap = new GeneratorDisplay();
            generatorSqlmap.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

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

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="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 通用 mapper 所在目录 -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <!-- tk mapper 生成时使用插件方式为每个生成的 mapper 继承 tk mapper 的类
                 需要注意的是:该 mapper 是需要你拷贝到你的 mapper 项目中去的,但是还不能让 项目中的 tk mapper 扫描到该类
             -->
            <property name="mappers" value="cn.mrcode.foodiedev.my.mapper.MyMapper"/>
        </plugin>

<!--        &lt;!&ndash; 指定自定义的注释添加实现 &ndash;&gt;-->
<!--        <commentGenerator type="cn.mrcode.mybatis.tkmappter.generator.MyCommentGenerator">-->
<!--            &lt;!&ndash; 是否去除自动生成的注释 true:是 : false:否 &ndash;&gt;-->
<!--            <property name="suppressAllComments" value="false"/>-->
<!--        </commentGenerator>-->


        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/foodie-shop-dev?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!-- 对应生成的 pojo 所在包 -->
        <javaModelGenerator targetPackage="cn.mrcode.foodiedev.pojo" targetProject="src/main/java"/>

		<!-- 对应生成的mapper所在目录 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>

		<!-- 配置mapper对应的java映射 -->
        <javaClientGenerator targetPackage="cn.mrcode.foodiedev.mapper" targetProject="src/main/java" type="XMLMAPPER"/>

        <!-- 数据库表 -->
		<table tableName="stu"></table>

    </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

需要注意的是:里面的包路径写是当前这个 生成器项目里的路径,生成之后的代码需要你复制到对应的项目中去,所以这里写的包名写成你实际要使用的项目包名,不然复制过去还需要改包名。

# 使用生成工具生成

这次我们要生成的表有如下

    <!-- 数据库表 -->
		<table tableName="carousel"></table>
		<table tableName="category"></table>
		<table tableName="users"></table>
		<table tableName="user_address"></table>
		<table tableName="items"></table>
		<table tableName="items_img"></table>
		<table tableName="items_spec"></table>
		<table tableName="items_param"></table>
		<table tableName="items_comments"></table>
		<table tableName="orders"></table>
		<table tableName="order_items"></table>
		<table tableName="order_status"></table>
1
2
3
4
5
6
7
8
9
10
11
12
13

执行 cn.mrcode.mybatis.tkmappter.generator.GeneratorDisplay#main 后,会生成对应的文件和代码

下面来看一个 mapper 接口

package cn.mrcode.foodiedev.mapper;

import cn.mrcode.foodiedev.my.mapper.MyMapper;
import cn.mrcode.foodiedev.pojo.Carousel;

public interface CarouselMapper extends MyMapper<Carousel> {
}
1
2
3
4
5
6
7

这也是为什么说那个 MyMapper 需要你拷贝到项目中去的原因,因为生成的时候是继承的它

  • 需要拷贝到 mapper 项目中的内容有,需要拷贝到对应的包路径下
    • xxxMyMapper 接口
    • MyMapper 接口
    • xxxMapper.xml xml 文件
  • 需要拷贝到 pojo 的内容有:pojo 指向的实体类

# 项目中整合 tkmapper

<!-- 通用 mapper 逆向工具 -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-spring-boot-starter</artifactId>
  <version>2.1.5</version>
</dependency>
1
2
3
4
5
6

yml 中增加 tk mapper 的配置

# 通用 Mapper 配置
mapper:
  # 指定要扫描的 mapper 接口
  mappers: cn.mrcode.foodiedev.my.mapper.MyMapper
  # 在进行数据库操作的时候,判断表达式  username != null, 是否追加 username != ''
  # 这里关闭了追加,自己手写
  not-empty: false
  identity: MYSQL
1
2
3
4
5
6
7
8