# 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>
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>
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> {
}
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();
}
}
}
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>
<!-- <!– 指定自定义的注释添加实现 –>-->
<!-- <commentGenerator type="cn.mrcode.mybatis.tkmappter.generator.MyCommentGenerator">-->
<!-- <!– 是否去除自动生成的注释 true:是 : false:否 –>-->
<!-- <property name="suppressAllComments" value="false"/>-->
<!-- </commentGenerator>-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&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>
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>
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> {
}
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>
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
2
3
4
5
6
7
8