Mapper一键生成

前言

在构建数据访问层时,如果为每张表手动编写 EntityMapper 接口及对应的 XML 文件,不仅工作量大,而且容易出错。为提升开发效率与代码一致性,通常会结合使用 MyBatis Generator(MBG)MyBatis 通用 Mapper 来实现Mapper 一键生成与通用 CRUD 操作。

为什么使用 Mapper 自动生成工具?

  1. 避免重复编写大量样板代码(如实体类、XML 映射、CRUD 方法)。
  2. 提升开发效率与项目一致性,减少人为错误。
  3. 便于项目快速迭代与维护,尤其在数据库结构频繁变化时。
  4. 统一数据访问层规范,确保各模块间结构一致。

一键生成工具

MyBatis Generator(MBG)

  • 官网http://mybatis.org/generator/
  • 作用根据数据库表结构自动生成实体类(Entity)、Mapper 接口及对应的 XML 映射文件。
  • 特点
    • 自动生成标准化代码,减少手写 SQL。
    • 可重复执行生成任务以适配数据库变更。
    • 支持自定义模板,灵活性较高。

适用场景:适合表结构复杂、字段较多、变更频繁的项目,通过自动生成标准化代码快速搭建数据层。

MyBatis 通用 Mapper

  • 官网https://github.com/abel533/Mapper
  • 作用:提供通用的 CRUD 操作接口,无需为每个实体类单独编写 Mapper 方法。
  • 特点
    • 继承通用接口即可获得完整的增删改查功能。
    • 支持批量操作、分页查询、条件构造等常用功能。
    • 通常无需 XML 文件,可直接基于注解或内置方法操作数据库。

适用场景:适用于中小型项目或表结构稳定的场景,能快速实现数据访问层逻辑,减少样板代码。

两者区别对比

特性MyBatis Generator (MBG)MyBatis 通用 Mapper
主要功能自动生成实体类、Mapper 接口及 XML 映射文件提供通用 CRUD 接口,继承即可使用
使用方式根据数据库表结构运行生成代码编写少量接口代码即可,无需生成 XML
适用场景表结构复杂或经常变动的大型项目表结构稳定、注重开发效率的中小型项目
代码量生成实体类 + Mapper 接口 + XML 文件,文件数量较多继承一个通用接口即可,代码量少
可维护性数据库变动需重新生成文件通用接口复用性高,变动影响小

最佳实践

结合使用 MBG + 通用 Mapper 可以实现自动化与通用化的最佳平衡:

  1. 使用 MBG 自动生成实体类与基础 Mapper 接口;
  2. 在生成的 Mapper 接口中 继承通用 Mapper 提供的基础 CRUD 功能;
  3. 需要个性化 SQL 时,可在生成的 XML 或接口中扩展自定义方法。

优势:

  • 自动化生成代码,减少重复劳动;
  • 通用接口提供标准化 CRUD,提升复用性;
  • 结合使用可兼顾灵活性与可维护性,适用于 Spring Boot + MyBatis 架构项目。

数据库准备

  1. 创建数据库

    选择 utf8mb4utf8mb4_unicode_ci 编码,因为它支持完整的 Unicode 字符集(包括中文、Emoji 和特殊符号),并且排序和比较遵循 Unicode 标准且大小写不敏感,保证数据库、应用和前端字符一致性,避免乱码问题。

img
  1. 执行SQL脚本,生成支付表
DROP TABLE IF EXISTS `t_pay`;
 
CREATE TABLE `t_pay` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `pay_no` VARCHAR(50) NOT NULL COMMENT '支付流水号',
  `order_no` VARCHAR(50) NOT NULL COMMENT '订单流水号',
  `user_id` INT(10) DEFAULT '1' COMMENT '用户账号ID',
  `amount` DECIMAL(8,2) NOT NULL DEFAULT '9.9' COMMENT '交易金额',
  `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='支付交易表';
 
INSERT INTO t_pay(pay_no,order_no) VALUES('pay17203699','6544bafb424a');
 
SELECT * FROM t_pay;
img

创建子模块 mybatis_generator2025

该子模块专门用于自动生成 MyBatis 的实体类、Mapper 接口及 XML 映射文件,实现数据访问层的标准化和自动化,减少手写 SQL 的重复工作,提高开发效率。

新建模块

img

添加依赖

<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
  <groupId>com.sun.cloud</groupId>
  <artifactId>cloud2025</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>
 
<artifactId>mybatis_generator2025</artifactId>
 
<properties>
  <maven.compiler.source>21</maven.compiler.source>
  <maven.compiler.target>21</maven.compiler.target>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
 
<dependencies>
  <!--Mybatis 通用mapper tk单独使用,自己独有+自带版本号-->
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.19</version>
  </dependency>
  <!-- Mybatis Generator 自己独有+自带版本号-->
  <dependency>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-core</artifactId>
      <version>1.4.2</version>
  </dependency>
  <!--通用Mapper-->
  <dependency>
      <groupId>tk.mybatis</groupId>
      <artifactId>mapper</artifactId>
  </dependency>
  <!--mysql9.2-->
  <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
  </dependency>
  <!--persistence-->
  <dependency>
      <groupId>jakarta.persistence</groupId>
      <artifactId>jakarta.persistence-api</artifactId>
  </dependency>
  <!--hutool-->
  <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
  </dependency>
  <!--lombok-->
  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
          <exclusion>
              <groupId>org.junit.vintage</groupId>
              <artifactId>junit-vintage-engine</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
</dependencies>
 
<build>
  <resources>
      <resource>
          <directory>${basedir}/src/main/java</directory>
          <includes>
              <include>**/*.xml</include>
          </includes>
      </resource>
      <resource>
          <directory>${basedir}/src/main/resources</directory>
      </resource>
  </resources>
  <plugins>
      <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <version>3.2.4</version>
          <configuration>
              <excludes>
                  <exclude>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                  </exclude>
              </excludes>
          </configuration>
      </plugin>
      <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.4.2</version>
          <configuration>
              <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
              <overwrite>true</overwrite>
              <verbose>true</verbose>
          </configuration>
          <dependencies>
              <dependency>
                  <groupId>com.mysql</groupId>
                  <artifactId>mysql-connector-j</artifactId>
                  <version>9.2.0</version>
              </dependency>
              <dependency>
                  <groupId>tk.mybatis</groupId>
                  <artifactId>mapper</artifactId>
                  <version>5.0.0</version>
              </dependency>
          </dependencies>
      </plugin>
  </plugins>
</build>
 
</project>

配置文件

  1. 配置连接参数:在 src\main\resources 路径下新建 config.properties
#t_pay表包名
package.name=com.sun.cloud
 
# mysql9.2
jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/db2025?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
jdbc.user = root
jdbc.password =12345678
  1. 设置输出路径:在 src\main\resources 路径下新建 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>
    <properties resource="config.properties"/>
 
    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
 
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>
 
        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.user}"
                        password="${jdbc.password}">
        </jdbcConnection>
 
        <javaModelGenerator targetPackage="${package.name}.entities" targetProject="src/main/java"/>
 
        <sqlMapGenerator targetPackage="${package.name}.mapper" targetProject="src/main/java"/>
 
        <javaClientGenerator targetPackage="${package.name}.mapper" targetProject="src/main/java" type="XMLMAPPER"/>
 
        <table tableName="t_pay" domainObjectName="Pay">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
    </context>
</generatorConfiguration>

一键生成

双击插件mybatis-generator:gererate,一键生成:entitymapperxml

imgimg

相关文章

评论区