一文了解MyBatis Generator

了解更多,关注微信公众号 「思客潘」

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 依赖。
MyBatis3KotlinMyBatis3DynamicSql 类似,但生成的是 Kotlin 代码,充分利用 Kotlin 的语言特性。兼具动态 SQL 的灵活性和 Kotlin 的简洁性。适用于 Kotlin 技术栈的项目。
MyBatis3传统的生成方式,会产生完整的 XML 映射文件和基于 Example 类的查询方法。无额外依赖,功能完整,支持复杂的 Example 查询。生成的代码量非常大,Example 类使用复杂,扩展性差。
MyBatis3SimpleMyBatis3 的简化版,只生成基础的 CRUD 操作,不生成 Example 类。代码量相对较少,结构简单。不支持动态条件查询,功能受限。

2.2 生成的产物

根据配置的不同,MBG 通常会生成以下几类文件:

  • Java/Kotlin 实体类 (Model/POJO):与数据库表结构一一对应,包含表字段的属性。
  • Mapper 接口:定义了所有数据库操作的方法,如 insert, selectByPrimaryKey 等。
  • SQL Map XML 文件(在 MyBatis3MyBatis3Simple 模式下):包含了 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 接口的类型,如 XMLMAPPERANNOTATEDMAPPER
    • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lisonseekpan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值