了解更多,关注微信公众号 「思客潘」
MyBatis Generator 权威指南:从入门到精通
1. 引言
1.1 什么是 MyBatis Generator?
MyBatis Generator (MBG) 是 MyBatis 社区提供的一款强大的代码生成工具。它能够通过自省数据库的表结构,自动生成与数据库表对应的持久层代码,包括 Java 实体类(POJO)、Mapper 接口以及 XML 映射文件。MBG 的核心目标是极大简化针对数据库表的常规 CRUD(创建、读取、更新、删除)操作的开发工作量,让开发者能够将更多精力投入到更复杂的业务逻辑和高级查询中 [1]。
对于大多数数据库操作是简单 CRUD 的项目而言,MBG 能够显著提升开发效率,减少手动编写样板代码的枯燥过程。然而,对于复杂的连接查询或存储过程,开发者仍需手动编写 SQL 和相应的代码。
1.2 核心优势
使用 MyBatis Generator 可以带来诸多好处,主要体现在以下几个方面:
- 提升开发效率:自动生成大量重复的 CRUD 代码,将开发者从繁琐的体力劳动中解放出来。
- 减少人为错误:相较于手动编写,代码生成器可以保证代码的规范性和准确性,减少因拼写错误、类型不匹配等问题导致的 bug。
- 保持代码一致性:确保项目中所有与数据库交互的代码风格统一,便于维护和团队协作。
- 支持迭代式开发:MBG 能够很好地融入持续集成的开发环境中。它可以重复运行,自动合并 XML 文件的变更,而不会覆盖开发者自定义的内容,非常适合敏捷和迭代式开发流程。
2. 核心概念与生成风格
MyBatis Generator 提供了多种代码生成风格和目标运行时(Target Runtime),以适应不同的项目需求和技术栈。这主要通过在配置文件中的 <context> 元素的 targetRuntime 属性来控制 [2]。
2.1 Target Runtime 详解
targetRuntime 决定了 MBG 生成代码的风格、依赖以及最终产物。下表详细对比了几个核心的运行时选项:
| Target Runtime | 描述 | 优点 | 缺点 |
|---|---|---|---|
| MyBatis3DynamicSql | (默认推荐) 生成基于 MyBatis Dynamic SQL 库的 Java 代码,不产生 XML 文件,所有 SQL 通过注解和 Java DSL 构建。 | 代码量少,查询构造极其灵活,类型安全。 | 需要额外引入 mybatis-dynamic-sql 依赖。 |
| MyBatis3Kotlin | 与 MyBatis3DynamicSql 类似,但生成的是 Kotlin 代码,充分利用 Kotlin 的语言特性。 | 兼具动态 SQL 的灵活性和 Kotlin 的简洁性。 | 适用于 Kotlin 技术栈的项目。 |
| MyBatis3 | 传统的生成方式,会产生完整的 XML 映射文件和基于 Example 类的查询方法。 | 无额外依赖,功能完整,支持复杂的 Example 查询。 | 生成的代码量非常大,Example 类使用复杂,扩展性差。 |
| MyBatis3Simple | MyBatis3 的简化版,只生成基础的 CRUD 操作,不生成 Example 类。 | 代码量相对较少,结构简单。 | 不支持动态条件查询,功能受限。 |
2.2 生成的产物
根据配置的不同,MBG 通常会生成以下几类文件:
- Java/Kotlin 实体类 (Model/POJO):与数据库表结构一一对应,包含表字段的属性。
- Mapper 接口:定义了所有数据库操作的方法,如
insert,selectByPrimaryKey等。 - SQL Map XML 文件(在
MyBatis3和MyBatis3Simple模式下):包含了 Mapper 接口方法对应的具体 SQL 实现。 - Example 类(在
MyBatis3模式下):用于构建复杂的动态查询条件(WHERE子句)。
3. 快速入门与运行方式
3.1 准备工作
在开始之前,请确保您的开发环境中已安装 Java 8 或更高版本,并准备好相应数据库的 JDBC 驱动程序。
3.2 运行方式概览
MBG 提供了多种灵活的运行方式,以适应不同的开发场景 [3]:
- Maven 插件(推荐):无缝集成到 Maven 项目的生命周期中,是最常用和推荐的方式。
- 命令行:通过
java -jar命令直接运行 MBG 的核心包。 - Ant 任务:适用于使用 Ant 作为构建工具的项目。
- Java 代码调用:通过编写 Java 代码以编程方式调用 MBG,提供了最高的灵活性。
- Eclipse 插件:为 Eclipse 用户提供了图形化界面和更好的集成体验。
3.3 使用 Maven 插件运行(推荐)
在 Maven 项目中使用 MBG 是最便捷的方式。只需在 pom.xml 文件中添加 mybatis-generator-maven-plugin 插件即可。
步骤 1:添加插件配置
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<!-- 指定配置文件的路径 -->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<!-- 允许覆盖生成的文件 -->
<overwrite>true</overwrite>
<!-- 将详细信息打印到控制台 -->
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- 添加数据库驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
步骤 2:执行生成命令
配置完成后,在项目根目录下打开终端,执行以下 Maven 命令即可触发代码生成:
mvn mybatis-generator:generate
4. 配置文件 generatorConfig.xml 详解
generatorConfig.xml 是 MyBatis Generator 的核心,它定义了代码生成的所有行为,从数据库连接到生成文件的具体细节 [4]。
一个典型的配置文件结构如下:
<?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>
<!-- 引入外部属性文件 -->
<properties resource="application.properties"/>
<!-- 数据库驱动类路径 -->
<classPathEntry location="/path/to/your/mysql-connector-java.jar" />
<!-- 核心配置上下文 -->
<context id="mysqlContext" targetRuntime="MyBatis3DynamicSql" defaultModelType="flat">
<!-- ... 详细配置 ... -->
</context>
</generatorConfiguration>
4.1 主要配置元素
| 元素 | 描述 |
|---|---|
<properties> | (可选) 用于加载外部属性文件(如 .properties 文件),方便管理数据库连接等敏感信息。 |
<classPathEntry> | (可选) 指定 JDBC 驱动的 JAR 文件路径。如果在 Maven 插件的 <dependencies> 中已定义,则此处可省略。 |
<context> | (核心) 定义了一组代码生成的配置。一个配置文件中可以有多个 <context>,每个 <context> 对应一个独立的生成任务。 |
4.2 <context> 内部关键配置
<context> 元素内部包含了代码生成的具体规则,以下是其关键子元素:
-
<jdbcConnection>: 配置数据库连接信息。driverClass: 驱动类名。connectionURL: 数据库连接 URL。userId: 用户名。password: 密码。
-
<javaModelGenerator>: 配置实体类的生成。targetPackage: 生成的实体类所在的包。targetProject: 目标项目路径(如src/main/java)。
-
<sqlMapGenerator>: 配置 XML 映射文件的生成(在MyBatis3等模式下使用)。targetPackage: 生成的 XML 文件所在的包(资源路径)。targetProject: 目标项目路径(如src/main/resources)。
-
<javaClientGenerator>: 配置 Mapper 接口的生成。type: Mapper 接口的类型,如XMLMAPPER或ANNOTATEDMAPPER。targetPackage: 生成的 Mapper 接口所在的包。targetProject: 目标项目路径。
-
<table>: 指定要为哪些数据库表生成代码。tableName: 数据库表名。可以使用%作为通配符匹配多个表。domainObjectName: (可选) 指定生成的实体类的名称。generatedKey: (可选) 配置主键生成策略,用于支持自增主键返回。
5. 详细案例:Spring Boot + MySQL + MyBatis Generator
接下来,我们将通过一个完整的案例,演示如何在 Spring Boot 项目中集成 MyBatis Generator,并实现从数据库表自动生成代码到最终通过 API 访问数据的全过程。
5.1 案例背景
假设我们正在开发一个简单的用户管理系统,需要对 user 表进行操作。我们将使用 MyBatis Generator 自动生成与 user 表相关的代码。
5.2 步骤 1:创建数据库和表
首先,在 MySQL 数据库中创建一个名为 test_db 的数据库,并创建 user 表。
CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4;
USE test_db;
CREATE TABLE `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` VARCHAR(50) NOT NULL COMMENT '用户名',
`email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
5.3 步骤 2:创建 Spring Boot 项目
通过 Spring Initializr 创建一个基本的 Spring Boot 项目,并添加以下依赖:
- Spring Web: 用于构建 Web 应用和 RESTful API。
- MyBatis Framework: MyBatis 核心框架。
- MySQL Driver: MySQL 数据库驱动。
- Lombok: (可选) 简化实体类的开发。
pom.xml 的核心依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
同时,按照 3.3 节 的方法,在 pom.xml 中配置好 mybatis-generator-maven-plugin。
5.4 步骤 3:配置 application.properties
在 src/main/resources/application.properties 文件中配置数据库连接信息:
# Database Connection
spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis Configuration
mybatis.mapper-locations=classpath:mapper/*.xml
5.5 步骤 4:编写 generatorConfig.xml
在 src/main/resources 目录下创建 generatorConfig.xml 文件。我们将使用传统的 MyBatis3 模式,因为它能生成直观的 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>
<properties resource="application.properties"/>
<context id="mysqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 阻止生成注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection driverClass="${spring.datasource.driver-class-name}"
connectionURL="${spring.datasource.url}"
userId="${spring.datasource.username}"
password="${spring.datasource.password}">
</jdbcConnection>
<!-- Java 类型解析器 -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 实体类生成配置 -->
<javaModelGenerator targetPackage="com.example.demo.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- XML 映射文件生成配置 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper 接口生成配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 指定要生成的表 -->
<table tableName="user" domainObjectName="User">
<generatedKey column="id" sqlStatement="mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
5.6 步骤 5:运行生成器并查看结果
执行 mvn mybatis-generator:generate 命令。成功后,您将在项目中看到以下新生成的文件:
src/main/java/com/example/demo/model/User.java(实体类)src/main/java/com/example/demo/mapper/UserMapper.java(Mapper 接口)src/main/resources/mapper/UserMapper.xml(XML 映射文件)
5.7 步骤 6:集成和测试
1. 启用 Mapper 扫描
在主启动类 DemoApplication.java 上添加 @MapperScan 注解,告诉 MyBatis 在哪里查找 Mapper 接口。
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2. 创建 Service 和 Controller
创建一个 UserService 来封装业务逻辑,并创建一个 UserController 来暴露 API 接口。
// UserService.java
package com.example.demo.service;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectByPrimaryKey(id);
}
}
// UserController.java
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
3. 运行和测试
启动 Spring Boot 应用。使用 curl 或浏览器访问 http://localhost:8080/users/1 (假设数据库中存在 ID 为 1 的用户),您应该能看到对应的用户信息以 JSON 格式返回。
6. 最佳实践与高级技巧
- 使用推荐的
MyBatis3DynamicSql模式:对于新项目,强烈建议使用MyBatis3DynamicSql模式,它提供了更现代化、更灵活的开发体验。 - 自定义插件:MBG 支持通过插件(Plugin)来扩展其功能,例如为所有实体类实现
Serializable接口,或添加 Lombok 注解等。 - 管理数据库密码:避免在
generatorConfig.xml中硬编码密码。使用<properties>元素加载外部配置文件,并将该文件排除在版本控制之外。 - 迭代式生成:在开发过程中,如果数据库表结构发生变化,只需重新运行
mvn mybatis-generator:generate命令即可更新代码。MBG 会智能地合并 XML 文件的变更。
7. 结论
MyBatis Generator 是一个功能强大且高度可配置的代码生成工具,是 MyBatis 生态系统中不可或缺的一环。通过自动化生成持久层代码,它不仅极大地提升了开发效率,还保证了代码的质量和一致性。无论是对于快速原型开发还是大型企业级应用,掌握 MyBatis Generator 都将使您的数据库开发工作事半功倍。
8. 参考文献
[1] MyBatis. (2023). Introduction to MyBatis Generator. https://mybatis.org/generator/
[2] MyBatis. (2023). MyBatis Generator Quick Start Guide. https://mybatis.org/generator/quickstart.html
[3] MyBatis. (2023). Running MyBatis Generator. https://mybatis.org/generator/running/running.html
[4] MyBatis. (2023). MyBatis Generator XML Configuration File Reference. https://mybatis.org/generator/configreference/xmlconfig.html
[5] CSDN. (2021). mybatis-generator使用详解(含Example类). https://blog.csdn.net/GluttonK/article/details/118254954
[6] 博客园. (2019). Mybatis代码生成器Mybatis-Generator使用详解. https://www.cnblogs.com/throwable/p/12046848.html
3万+

被折叠的 条评论
为什么被折叠?



