跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. SpringBoot 集成 MyBatis 与 MyBatis-Plus 详解
  2. SpringBoot 集成 MyBatis
  3. 回顾 MyBatis
  4. 1.2 MyBatis 核心组件
  5. 环境准备
  6. MyBatis-Spring-Boot-Starter
  7. 核心优势
  8. 创建项目并集成
  9. 1. 指定 MyBatis 全局配置文件路径(mybatis-config.xml),可配置全局参数(如缓存、插件、驼峰转换等)
  10. 2. 指定 MyBatis Mapper 映射文件(XML)的扫描路径,匹配 classpath 下 mybatis/mapper 目录下的所有 .xml 文件
  11. 3. 指定实体类包路径,配置后在 XML 中可直接使用实体类名代替全类名
  12. SpringBoot 集成 MyBatis-Plus
  13. MyBatis-Plus 简介
  14. 什么是 MyBatis-Plus?
  15. 核心优势
  16. Lombok 简介
  17. 导入依赖
  18. 使用示例
  19. MyBatis-Plus 快速上手
  20. 启动类
  21. 添加配置
  22. 替换依赖
  23. 编码
  24. 常用注解
  25. @TableName
  26. 全类名:com.baomidou.mybatisplus.annotation.TableName
  27. 核心作用
  28. 常用属性
  29. @TableId
  30. 全类名:com.baomidou.mybatisplus.annotation.TableId
  31. 核心作用
  32. 常用属性
  33. IdType 枚举值说明
  34. @TableField
  35. 全类名:com.baomidou.mybatisplus.annotation.TableField
  36. 核心作用
  37. 常用属性
  38. 核心功能
  39. CRUD 接口
  40. 条件构造器
  41. 核心构造器类型
  42. 常用条件方法
  43. 使用示例
  44. 1. QueryWrapper(基础查询)
  45. 2. UpdateWrapper(更新操作)
  46. 3. LambdaQueryWrapper(类型安全查询)
  47. 注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
Javajava

SpringBoot 集成 MyBatis 与 MyBatis-Plus 详解

SpringBoot 集成 MyBatis 和 MyBatis-Plus 的完整流程。涵盖基础组件回顾、环境准备、依赖引入、配置文件设置、Mapper 接口编写及注解使用。MyBatis-Plus 部分介绍了核心优势、Lombok 集成、常用注解(@TableName, @TableId, @TableField)及条件构造器(Wrapper)的使用示例,帮助开发者快速实现 CRUD 操作。

RustyLab发布于 2026/1/11更新于 2026/4/211 浏览
SpringBoot 集成 MyBatis 与 MyBatis-Plus 详解

SpringBoot 集成 MyBatis 与 MyBatis-Plus 详解

MyBatis 作为一款优秀的持久层框架,以其灵活的 SQL 定制能力和低侵入性成为 Java 开发中主流的 ORM 方案。而 SpringBoot 凭借'约定优于配置'的理念,大幅简化了项目搭建和配置流程。本文将从 MyBatis 基础回顾入手,一步步讲解 SpringBoot 集成 MyBatis、MyBatis-Plus 的完整流程,同时补充 Lombok、核心注解、常见配置等关键知识点。

SpringBoot 集成 MyBatis

回顾 MyBatis

  • SqlSessionFactory:会话工厂,MyBatis 核心入口,通过配置文件(mybatis-config.xml)或代码构建,负责创建 SqlSession。
  • SqlSession:会话对象,封装了数据库操作的所有方法(增删改查),是 MyBatis 与数据库交互的核心对象,线程不安全,需用完即关。
  • Mapper 接口:数据访问层接口,MyBatis 会通过动态代理生成接口的实现类,开发者只需定义接口和 SQL,无需编写实现类。
  • XML 映射文件:核心配置 SQL 语句、参数映射、结果映射等,与 Mapper 接口一一对应(也可通过注解替代)。

MyBatis 是一款半自动化的 ORM(对象关系映射)框架,它摒弃了传统 JDBC 的硬编码式 SQL 操作,将 SQL 语句与 Java 代码解耦,支持 XML 或注解两种方式编写 SQL,同时提供结果映射、参数绑定等核心功能。

1.2 MyBatis 核心组件
  • 配置文件繁琐(需手动配置数据源、SqlSessionFactory、Mapper 扫描等);
  • 重复代码多(如 SqlSession 创建、关闭,事务处理等);
  • 基础 CRUD 操作需手动编写 SQL,效率低;
  • 分页、逻辑删除等功能需手动实现。

环境准备

  • JDK 8+
  • SpringBoot 2.7.x/3.x
  • MySQL 8.0+
  • Maven/Gradle

MyBatis-Spring-Boot-Starter

  • 自动配置:自动检测数据源、自动创建 SqlSessionFactory 和 SqlSessionTemplate(线程安全的 SqlSession 封装);
  • 简化依赖:通过 Starter 依赖一键引入 MyBatis 及 Spring 集成所需的所有包,无需手动管理依赖版本;
  • 无缝集成 Spring:将 Mapper 接口自动注册为 Spring Bean,支持 Spring 事务管理;
  • 灵活扩展:保留 MyBatis 原生配置能力,可通过配置文件或注解覆盖默认配置。

MyBatis-Boot 是 MyBatis 官方提供的 SpringBoot 集成组件(mybatis-spring-boot-starter),核心目标是简化 MyBatis 在 SpringBoot 项目中的配置,实现'零配置'快速集成。

核心优势

创建项目并集成

  1. 创建 SpringBoot 项目:选择 SpringBoot 版本,添加 SQL 模块下的"Mybatis Framework"和"MySQL Driver"依赖。
  2. 配置相关信息:使用 application.properties 或 application.yml。
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/<database_name>?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=root
    # 1. 指定 MyBatis 全局配置文件路径(mybatis-config.xml),可配置全局参数(如缓存、插件、驼峰转换等)
    mybatis.config-location=classpath:mybatis-config.xml
    # 2. 指定 MyBatis Mapper 映射文件(XML)的扫描路径,匹配 classpath 下 mybatis/mapper 目录下的所有 .xml 文件
    mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
    # 3. 指定实体类包路径,配置后在 XML 中可直接使用实体类名代替全类名
    mybatis.type-aliases-package=com.example.entity
    
  3. 启动类配置:在启动类中添加对 Mapper 包扫描 @MapperScan,SpringBoot 启动时就会扫描该路径下的 Mapper。
  4. 全局配置:在 resources/mybatis 目录下添加 mybatis-config.xml,配置一些全局属性。
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="autoMappingBehavior" value="FULL"/>
    </settings>
    
  5. 编写代码:
    • 编写 Mapper 接口:
      public interface SysRoleMapper {
          /* 查询所有角色信息 */
          List<SysRole> getAll();
      }
      
    • 编写实体类:
      public class SysRole {
          private Long id; //主键 ID
          private String code; //角色编码
          private String roleName; //角色名称
          //省略 get/set...
      }
      
    • 在 resources/mybatis/mapper 目录下创建并编写 SysRoleMapper.xml:
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.example.mapper.SysRoleMapper">
          <select resultType="com.example.entity.SysRole">
              select * from sys_role
          </select>
      </mapper>
      
    • 或者直接在 Mapper 接口加上 @Mapper 注解,建议直接使用上面的方式不然需要一个个在接口上添加注解。
  6. 测试:编写 JUnit 测试类。
    @SpringBootTest
    public class SysRoleMapperTest {
        @Autowired
        private SysRoleMapper sysRoleMapper;
        
        @Test
        public void testSelectAll() {
            List<SysRole> sysRoles = sysRoleMapper.getAll();
            for (SysRole sysRole : sysRoles) {
                System.out.println(sysRole);
            }
        }
    }
    

运行效果:此处无法看到输出执行的 SQL,并且会输出其他日志信息,可以在 application.properties 中配置日志输出:

logging.level.root=warn
logging.level.com.example.mapper=trace
logging.pattern.console=%p%m%n

至此,SpringBoot 和 MyBatis 集成就完成了。

SpringBoot 集成 MyBatis-Plus

MyBatis-Plus 简介

MyBatis-Plus(简称 MP)是基于 MyBatis 的增强工具,在保留 MyBatis 原有功能的基础上,实现了'无 SQL'CRUD、分页、逻辑删除、乐观锁等功能,大幅提升开发效率。

什么是 MyBatis-Plus?

MyBatis-Plus 核心理念是'只做增强,不做改变',它封装了基础 CRUD 操作,无需编写 SQL 即可实现数据访问,同时支持自定义 SQL 扩展,完美兼容 MyBatis 原有代码。

核心优势
  • 内置通用 Mapper/Service,无需编写基础 CRUD SQL;
  • 支持自动分页、逻辑删除、乐观锁、枚举映射等高频功能;
  • 强大的条件构造器(QueryWrapper),灵活拼接复杂 SQL;
  • 支持主键自动生成(雪花算法、自增等);
  • 无缝兼容 MyBatis 配置和代码。

Lombok 简介

Lombok 是一款 Java 开发插件,通过注解(如 @Data、@NoArgsConstructor)自动生成 getter/setter/构造器/toString 等代码,核心优势:

  • 简化实体类代码,减少冗余;
  • 提高开发效率,避免手动维护 getter/setter;
  • 支持链式编程(@Accessors(chain = true))。
导入依赖
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
使用示例
// 链式调用(可选)
@Accessors(chain = true)
// 核心简化:getter/setter/toString/equals/hashCode + 无参构造
@Data
// 补充全参构造(@Data 不含全参)
@AllArgsConstructor
// 补充无参构造(若@Data 的@RequiredArgsConstructor 覆盖了无参,需显式声明)
@NoArgsConstructor
public class User {
    private Long id;
    private String username;
    // 排除 toString 输出
    @ToString.Exclude
    private String password;
    private Integer age;
}

MyBatis-Plus 快速上手

启动类
添加配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/ktsms_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
logging.level.root=warn
logging.level.com.example.mapper=trace
logging.pattern.console=%p%m%n
替换依赖

将 MyBatis Starter 替换为 MyBatis-Plus Starter(无需额外引入 MyBatis 依赖):

<!-- MyBatis-Plus SpringBoot 集成包 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

在启动类中添加 Mapper 包的扫描,和之前 MyBatis 一样的操作。

编码
  • @TableName 注解在类上,指定数据库表名 (实体名与表名不一致时需要指定)
  • @TableId(type = IdType.AUTO) 注解在主键属性上,且指定主键生成策略为自动增长
  • @TableField 注解在属性上,指定数据库字段名 (不满足默认匹配规则时需要指定)。属性和字段名默认匹配规则是全小写的属性对应同名的字段:采用骆驼命名规则的属性对应的字段名为两个单词之间使用_下划线连接,例如:usrName 属性默认对应的字段名为 usr_name。

编写 Mapper 接口:

public interface SysRoleMapper extends BaseMapper<SysRole> { }

编写实体类 SysRole:

@Data
@NoArgsConstructor
@AllArgsConstructor
// 表名
@TableName("sys_role")
public class SysRole {
    // 主键 ID, 自增
    @TableId(type = IdType.AUTO)
    private Long id;
    //主键 ID
    private String code; //角色编码
    private String roleName; //角色名称
    private Long createdUserId; //创建者
    private Date createdTime; //创建时间
    private Long updatedUserId; //修改者
    private Date updatedTime; //修改时间
}

创建 SysRoleMapperTester.java:

@SpringBootTest
public class SysRoleMapperTest {
    @Autowired
    private SysRoleMapper sysRoleMapper;
    
    @Test
    public void testSelectAll() {
        List<SysRole> sysRoles = sysRoleMapper.selectList(null);
        for (SysRole sysRole : sysRoles) {
            System.out.println(sysRole);
        }
    }
}

至此,SpringBoot 集成 MyBatis-Plus 完成,通过以上几个步骤我们就实现了 sysRole 查询所有数据的功能,基本的 CRUD 都能完成,几乎不用写 SQL 语句。

常用注解

MyBatis Plus 如何知道我们要查询的是哪张表?表中有哪些字段呢?

MyBatis Plus 就是根据 PO 实体的信息来推断出表的信息,从而生成 SQL 的。默认情况下:

  • MyBatis Plus 会把 PO 实体的类名驼峰转下划线作为表名
  • MyBatis Plus 会把 PO 实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型
  • MyBatis Plus 会把名为 id 的字段作为主键

但很多情况下,默认的实现与实际场景不符,因此 MyBatis Plus 提供了一些注解便于我们声明表信息。

@TableName
全类名:com.baomidou.mybatisplus.annotation.TableName
核心作用

指定实体类对应的数据库表名(解决实体类名与表名不一致的问题)。

常用属性
属性名类型作用
valueString表名(核心属性,可省略属性名直接写值)
schemaString数据库 schema(多租户 / 多 schema 场景)
keepGlobalPrefixboolean是否保留全局表前缀(配合 mybatis-plus.global-config.db-config.table-prefix 使用)
@TableId
全类名:com.baomidou.mybatisplus.annotation.TableId
核心作用

标记实体类的主键字段,指定主键生成策略。

常用属性
属性名类型作用
valueString主键字段名(实体属性名与表主键字段名不一致时使用)
typeIdType(枚举)主键生成策略(核心属性)
IdType 枚举值说明
枚举值作用
AUTO数据库自增(需保证数据库表主键设置为自增)
NONE无策略(需手动设置主键值)
INPUT手动输入(与 NONE 类似,MP 不干预,需手动赋值)
ASSIGN_ID雪花算法生成主键(默认,支持 Long/Integer/String 类型,适合分布式场景)
ASSIGN_UUID生成 UUID(不含中划线,String 类型)
ID_WORKER已过时,等效 ASSIGN_ID(仅支持 Long 类型)
ID_WORKER_STR已过时,等效 ASSIGN_ID(String 类型)
UUID已过时,等效 ASSIGN_UUID
@TableField
全类名:com.baomidou.mybatisplus.annotation.TableField
核心作用

指定实体属性与数据库表字段的映射关系,支持排除字段、字段填充、忽略字段等功能。

常用属性
属性名类型作用
valueString字段名(实体属性名与表字段名不一致时使用)
existboolean是否为数据库表字段(默认 true,false 表示该属性非表字段)
fillFieldFill(枚举)字段填充策略(新增 / 更新时自动填充,如创建时间、更新时间)
selectboolean查询时是否包含该字段(默认 true,false 表示查询时忽略)
insertStrategyFieldStrategy(枚举)插入时的字段验证策略(如 NOT_NULL:非空才插入)
updateStrategyFieldStrategy(枚举)更新时的字段验证策略(如 IGNORED:忽略空值,强制更新)
whereStrategyFieldStrategy(枚举)作为查询条件时的验证策略

核心功能

从以上步骤中,我们可以看到集成 MyBatis-Plus 非常的简单,只需要引入 starter 启动器,并配置 mapper 扫描路径即可。 但 MyBatis-Plus 的强大远不止这些功能,想要详细了解 MyBatis-Plus 的强大功能?那就继续往下看吧!

CRUD 接口

MyBatis 通用的 CRUD 功能都在 BaseMapper<T> 接口中:

  • BaseMapper 接口封装通用 CRUD,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
  • 参数 Serializable 为任意类型主键,Mybatis-Plus 不推荐使用复合主键,约定每一张表都有自己的唯一 id 主键
  • 泛型 T 为任意实体对象
  • 对象 Wrapper 为条件构造器
条件构造器

条件构造器(Wrapper)是 MyBatis-Plus 实现动态 SQL 的核心,通过链式调用拼接 WHERE 条件,无需手动拼接 SQL 字符串,支持查询、更新、删除操作。

核心构造器类型
构造器类型适用场景核心特点
QueryWrapper查询 / 删除条件构造基础版,字段名硬编码
UpdateWrapper更新条件构造支持直接设置更新字段
LambdaQueryWrapper查询 / 删除条件构造(Lambda)类型安全,避免字段名写错
LambdaUpdateWrapper更新条件构造(Lambda)类型安全,无字段硬编码
常用条件方法
方法作用示例
eq等于 =eq("age", 20)
gt/ge大于 >/ 大于等于≥gt("age", 18)
lt/le小于 < / 小于等于≤lt("age", 30)
like模糊查询 LIKElike ("name", "张")
inIN 条件in("id", Arrays.asList(1,2,3))
orderByDesc降序排序orderByDesc("age")
select指定查询字段select("id", "name")
set更新字段赋值set("age", 21)

使用示例

1. QueryWrapper(基础查询)
QueryWrapper<User> wrapper = new QueryWrapper<User>()
    .eq("user_name", "张三")
    .gt("age", 18)
    .like("email", "qq.com");
List<User> list = userMapper.selectList(wrapper);
2. UpdateWrapper(更新操作)
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
    .eq("user_name", "张三")
    .set("age", 22)
    .setSql("age = age + 1"); // 支持 SQL 片段
userMapper.update(null, wrapper);
3. LambdaQueryWrapper(类型安全查询)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
    .eq(User::getUserName, "张三")
    .gt(User::getAge, 18);
List<User> list = userMapper.selectList(wrapper);
注意事项
  1. Lambda 版构造器通过实体类方法引用字段(如 User::getAge),避免字段名硬编码错误;
  2. UpdateWrapper 可直接通过 set/setSql 设置更新字段,无需创建实体类;
  3. 条件默认以 AND 拼接,需 OR 时调用 .or() 方法即可。
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • RabbitMQ 常见工作模式及发布确认实现
  • 中文方言合成突破:粤语与四川话在 VoxCPM-1.5-TTS 中的表现
  • STM32 上运行 AI 大模型的四种方案及案例
  • Python venv 虚拟环境工具使用指南及 uv 升级教程
  • MCP 工具速成:npx 与 uvx 全流程安装指南
  • Ubuntu 查看磁盘空间与分区常用命令
  • MySQL 事务隔离级别与并发问题分析
  • Windows 安装 WSL2 并运行 Ubuntu 22.04 指南
  • 从冯诺依曼到操作系统:打通 Linux 底层核心逻辑
  • 使用 OVITO-Python 进行 LAMMPS 后处理:统计 Type=1 原子沿 X 方向密度分布
  • MySQL 日志系统优化:海量日志存储与查询性能提升
  • CUDA、Python、PyTorch、MMCV、MMDet 版本对照表
  • Linux 库制作与原理:从生成使用到 ELF 文件与链接解析
  • Spring AI Alibaba 快速入门指南
  • Linux 远程服务器直接下载 HuggingFace 模型与数据集
  • Ubuntu 24.04 LTS 安装 NVIDIA 显卡驱动、CUDA 12.5 及 Docker 容器工具包
  • Trae AI 编程助手构建发票管理 SaaS 应用实战
  • C++ string 类模拟实现详解
  • Java 核心面试题与答案详解
  • MySQL 事务隔离级别与一致性详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online