跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

SpringBoot 集成 MyBatis 与 MyBatis-Plus 详解

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

RustyLab发布于 2026/1/11更新于 2026/6/1236 浏览
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
    
  • 启动类配置:在启动类中添加对 Mapper 包扫描 @MapperScan,SpringBoot 启动时就会扫描该路径下的 Mapper。
  • 全局配置:在 resources/mybatis 目录下添加 mybatis-config.xml,配置一些全局属性。
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="autoMappingBehavior" value="FULL"/>
    </settings>
    
  • 编写代码:
    • 编写 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 注解,建议直接使用上面的方式不然需要一个个在接口上添加注解。
  • 测试:编写 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() 方法即可。

    目录

    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折了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 🤖 一键搭建Deepseek满血版了解详情
    • 一键打造专属AI 智能体了解详情
    极客日志微信公众号二维码

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

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

    更多推荐文章

    查看全部
    • 多模态大模型主流架构与技术要点总结
    • Vheer:免费免登录的 AI 绘画与视频生成工具
    • 前端实现视频画中画功能与主小窗同步控制
    • 从单卡到多卡:LLaMA Factory 微调扩展指南
    • 基于 Rokid AR 眼镜的健康管理应用开发实践
    • 突破 LLM 上下文瓶颈:上下文内存虚拟化 CMV 的设计与实践
    • 国内外免费 AI 平台盘点:零成本调用大模型 API
    • JavaScript 基础:深入理解 if 语句逻辑
    • SpringBoot 整合 Neo4j 图数据库项目实战详解
    • C++26 契约编程:三种实现方式与最佳实践
    • 前端开发者必备的 3 项核心技能:设计、工程实践与硬件优化
    • Dify 入门:从 Web 到 API 的交付与集成方案
    • 基于 OpenClaw 与 Open WebUI 搭建企业多部门 AI 平台
    • Claude Code 安装指南(Windows / macOS)
    • 前缀和算法实战:连续数组与矩阵区域和
    • 变分自编码器(VAE)原理与 PyTorch 实战实现
    • 论文降 AI 率实战:人工润色技巧与 5 款工具测评
    • llama.cpp 本地部署常见故障排查与优化方案
    • 银河麒麟 V10 操作系统 Java 安装配置教程
    • Claude Code 核心权限模式与辅助功能详解

    相关免费在线工具

    • 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