mybatis-generator 使用教程

为什么使用 MBG ?

提高开发效率

MBG 自动生成 MyBatis 相关的代码,包括 Java 实体类、SQL 映射文件和 DAO 接口,这样开发者可以节省大量的时间和精力,专注于业务逻辑的开发。

保证代码一致性

手动编写的代码容易产生风格不一致和错误,而 MBG 生成的代码遵循一致的规范和模板,保证代码的一致性和可维护性。

快速迭代

在数据库表结构发生变化时,MBG 可以快速生成新的代码,减少手动修改代码的工作量,适应快速迭代的开发需求。

减少重复劳动

对于大多数 CRUD(创建、读取、更新、删除)操作,MBG 可以自动生成标准的代码,避免开发者重复编写类似的代码,提高开发效率。

适应复杂的 SQL 映射

MBG 支持复杂的 SQL 映射生成,可以生成包括关联查询、多表联查等复杂 SQL 映射文件,满足复杂业务需求。

提供灵活的配置

MBG 提供了高度可配置性,开发者可以根据具体需求配置生成的代码,包括生成文件的包结构、文件路径、表的映射等。

集成开发工具

MBG 可以很方便地与 Maven 集成,通过 Maven 插件可以轻松运行 MBG,生成和更新代码,并且可以与其他开发工具和 CI/CD(持续集成/持续部署)流程无缝结合。

使用场景

  • 新项目初始化: 在项目初始化阶段,可以使用 MBG 根据数据库结构快速生成基础代码。
  • 数据库表结构变更: 在数据库表结构变更时,可以使用 MBG 重新生成代码,保持代码与数据库结构的一致性。
  • 标准化代码: 使用 MBG 生成标准化的 CRUD 代码,提高代码一致性和可维护性。

小结

使用 MyBatis Generator 可以:

  • 显著提高开发效率,减少重复劳动
  • 保证代码的一致性,并且提供灵活的配置选项和强大的功能支持

如何使用 MBG ?

Step 1. 导入依赖

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
<project>
<!-- 其他配置 -->
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!--允许移动生成的文件-->
<verbose>true</verbose>
<!--允许自动覆盖文件,第一次可覆盖,以后都不可覆盖-->
<overwrite>true</overwrite>
<!-- 自定义配置文件的名称 默认是generatorconfig.xml -->
<configurationFile>
src/main/resources/mybatis-generator.xml
</configurationFile>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Step 2. 配置 mybatis-generator.xml

Resource 目录下创建一个 mybatis-generator.xml 文件

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?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">
<!-- 如果是粘贴复制的话,有可能上面这行会报红,按住Ctrl+Enter 导入即可 -->
<generatorConfiguration>

<!-- context 是逆向工程的主要配置信息 -->
<!-- id: 名字而已 作为唯一标识 -->
<!-- targetRuntime: 设置生成的文件使用于哪个 MyBatis 版本 -->
<context id="default" targetRuntime="MyBatis3">
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true"
userId="root"
password="root">
</jdbcConnection>

<!--生成pojo存放位置-->
<!-- targetPackage: 生成实体类所在的包 -->
<!-- targetProject: 生成实体类所在的硬盘位置 -->
<javaModelGenerator targetPackage="com.movie.pojo" targetProject="src/main/java">

<!-- 是否允许子包 -->
<property name="enableSubPackages" value="true" />
<!-- 是否对modal添加构造函数 -->
<property name="constructorBased" value="true" />
<!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
<property name="trimStrings" value="true" />
<!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
<property name="immutable" value="false" />

</javaModelGenerator>

<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="mapping.mybatis" targetProject="src/main/resources">
<!-- 针对数据库的一个配置,是否把 schema 作为包名 -->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>

<!--生成Dao类存放位置 也就是生成接口所在的位置 -->
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.movie.dao" targetProject="src/main/java">
<!-- 针对 Oracle 数据库的一个配置,是否把 schema 作为包名 -->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>

<!--生成对应表及类名,这里每一个表的五项属性是为了删除自动编写的复杂查询-->
<!-- tableName: 对应的是数据库表名,domainObjectName: 是实体类的名字,可以自定义-->
<!-- enableUpdateByExample: 是否生成基于 Example 类的 update 方法 ,其余同理-->
<table tableName="user" domainObjectName="User" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false"></table>

<table tableName="t1_user" domainObjectName="t1User" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
<!-- 用于指示生成XML文件时,是否需要显式插入id,如果需要显式插入id,将下面这行注释即可 -->
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>

<table tableName="sys_user" domainObjectName="sysUser" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false"></table>

</context>
</generatorConfiguration>
1
<generatedKey column="id" sqlStatement="MySql" identity="true"/>

这里的各个属性含义如下:

  • column: 指定数据库表中用作主键的列的名称,这里是 "id"

  • sqlStatement: 指定用于生成主键的SQL语句或数据库特定的策略。对于MySQL数据库,通常使用 "MySql",它会利用数据库的自增特性来生成主键。

  • identity: 设置为 "true" 时,表示这个主键是由数据库自动增长(auto increment)生成的。这意味着MBG在插入记录时会依赖数据库自动生成的主键值。

这段配置告诉 MyBatis Generator,当插入新记录到数据库时,id 列应使用数据库的自增特性来生成主键值,而不需要在插入语句中显式指定主键值。这样做的好处是简化了数据插入操作,并且可以确保主键值的唯一性和递增性。

Q:不加这条配置是不是相当于插入时必须指定主键?

A:不完全是这样。如果不加 <generatedKey> 配置,MyBatis Generator 生成的插入语句将不会自动处理主键。这意味着以下几种情况可能会发生:

  1. 如果数据库表的主键列设置为自增 (AUTO_INCREMENT 在 MySQL 中),即使你没有在 MyBatis 的插入语句中指定主键值,数据库在执行插入操作时仍然会自动为主键分配一个唯一的值。

  2. 如果数据库表的主键列没有设置为自增,或者需要使用特定的算法或方法来生成主键值(如 UUID 或序列),那么在插入记录时,你需要显式地提供一个主键值。

  3. 在某些情况下,如果你没有提供主键值,并且数据库表也没有设置自增主键,插入操作可能会失败,因为主键是不允许为空的,并且必须是唯一的。

因此,<generatedKey> 配置项主要是用来告诉 MyBatis Generator 如何处理主键的生成,以便在生成的代码中正确地插入新记录。如果你的表已经设置了自增主键,MyBatis Generator 默认不会包含主键值,数据库会自动处理。如果没有设置自增,通常需要在应用层生成主键值并在插入语句中指定。

Step 3. 双击 maven 插件的 mybatis-generator:generate

运行效果图(来源):

image-20240714220115416

END