SpringBoot 集成 MyBatis/MyBatis-Plus使用示例教程

 更新时间:2025年12月19日 10:48:36   作者:顾北12  
本文详细介绍了如何在Spring Boot项目中集成MyBatis和MyBatis-Plus,并通过Lombok简化代码,通过本文的学习,开发者可以快速掌握Spring Boot集成MyBatis和MyBatis-Plus的完整流程,并利用Lombok提高开发效率,感兴趣的朋友跟随小编一起看看吧

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

SpringBoot集成Mybatis

回顾MyBatis

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

1.2 MyBatis 核心组件

  • SqlSessionFactory:会话工厂,MyBatis 核心入口,通过配置文件(mybatis-config.xml)或代码构建,负责创建 SqlSession。
  • SqlSession:会话对象,封装了数据库操作的所有方法(增删改查),是 MyBatis 与数据库交互的核心对象,线程不安全,需用完即关。
  • Mapper 接口:数据访问层接口,MyBatis 会通过动态代理生成接口的实现类,开发者只需定义接口和 SQL,无需编写实现类。
  • XML 映射文件:核心配置 SQL 语句、参数映射、结果映射等,与 Mapper 接口一一对应(也可通过注解替代)。
  • 配置文件繁琐(需手动配置数据源、SqlSessionFactory、Mapper 扫描等);
  • 重复代码多(如 SqlSession 创建、关闭,事务处理等);
  • 基础 CRUD 操作需手动编写 SQL,效率低;
  • 分页、逻辑删除等功能需手动实现。

SpringBoot集成Mybatis

环境准备

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

MyBatis-Spring-Boot-Starter

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

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

创建项目并集成:

第一步,创建SpringBoot项目,项目信息设置如下图所示:

第二步:选择SpringBoot版本为3.3.5,添加SQL模块下的"Mybatis Framework"和"MySQL Driver依赖"如下图所示,点击"Create"按钮完成创建项目:

项目创建好了以后会自动引入对应的依赖:

第三步配置相关信息,可以使用application.propertiest以及application.yml,这里以propertiest为例:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/《数据库名称》?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=用户名
spring.datasource.password=密码
# 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 中可直接使用实体类名(如 User)代替全类名(com.yugonyun.demo.entity.User),简化 resultType/parameterType 配置
mybatis.type-aliases-package=com.yugonyun.demo.entity

第四步:在启动类中添加对Mapper包扫描@MapperScan,SpringBoot启动时就会扫描该路径下的Mapper:

  • 或者直接在Mapper接口加上@Mapper注解,建议直接使用上面的方式不然需要一个个在接口上添加注解
  • 第五步:编码resources/mabatis目录下添加mybatis-config.xml,配置一些全局属性
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="autoMappingBehavior" value="FULL"/>
    </settings>

编写实体类:

public class SysRole {
    private Long id;  //主键ID
    private String code;  //角色编码
    private String roleName;  //角色名称
    private Long createdUserId;  //创建者
    private Date createdTime;  //创建时间
    private Long updatedUserId;  //修改者
    private Date updatedTime;  //修改时间
    //省略get/set...
}

编写Mapper接口:

public interface SysRoleMapper {
    /*
    * 查询所有角色信息
    * */
    public List<SysRole> getAll();
}

在resources/mybaits/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.ktjiaoyu.mapper.SysRoleMapper">
        <select id="getAll" resultType="com.ktjiaoyu.entity.SysRole">
        select * from sys_role
    </select>
</mapper>

第六步:测试编写Junit测试类SysRoleMapperTester.java:

@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.propertis中配置日志输出:

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

至此,SpringBoot和Mybatis集成就完成了

SpringBoot集成Mybatis-Plus

Mybaits-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快速上手

替换依赖

将 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>

添加配置:

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.yugonyun.mapper=trace
logging.pattern.console=%p%m%n

启动类

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

编码:

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

编写Mapper接口:

public interface SysRoleMapper extends BaseMapper<SysRole> {
}

测试:

创建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集成Mybaits-Plus完成,通过以上几个步骤我们就实现了sysRole查询所有数据的功能,基本的CRUD都能完成,几乎不用写SQL语句

常用注解

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

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

  • MybatisPlus 会把 PO 实体的类名驼峰转下划线作为表名MybatisPlus 会把PO 实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类D型推断字段类型
  • MybatisPlus 会把名为id的字段作为主键
  • 但很多情况下,默认的实现与实际场景不符,因此 MybatisPlus提供了一些注解便于我们声明表信息。

@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-Plus通用的CRUD功能都在 BaseMapper<T>接口中:

说明:

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

条件构造器:

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

核心构造器类型
构造器类型适用场景核心特点
QueryWrapper<T>查询 / 删除条件构造基础版,字段名硬编码
UpdateWrapper<T>更新条件构造支持直接设置更新字段
LambdaQueryWrapper<T>查询 / 删除条件构造(Lambda)类型安全,避免字段名写错
LambdaUpdateWrapper<T>更新条件构造(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() 方法即可。

到此这篇关于SpringBoot 集成 MyBatis/MyBatis-Plus使用示例教程的文章就介绍到这了,更多相关SpringBoot 集成 MyBatis/MyBatis-Plus 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基于代理模式解决红酒经销问题详解

    Java基于代理模式解决红酒经销问题详解

    这篇文章主要介绍了Java基于代理模式解决红酒经销问题,详细描述了代理模式的概念、原理并结合实例形式分析了java基于代理模式解决红酒经销问题的相关步骤、实现方法与操作注意事项,需要的朋友可以参考下
    2018-04-04
  • Spring AOP基本概念

    Spring AOP基本概念

    这篇文章主要为大家详细介绍了spring基础概念AOP与动态代理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-07-07
  • 深入理解JVM自动内存管理

    深入理解JVM自动内存管理

    对于Java虚拟机在内存分配与回收的学习,本文主要介绍了JVM自动内存管理,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java数组的扩容代码示例

    Java数组的扩容代码示例

    这篇文章主要介绍了Java数组的扩容,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2017-09-09
  • Java 8 Stream操作类型及peek示例解析

    Java 8 Stream操作类型及peek示例解析

    这篇文章主要介绍了Java 8 Stream操作类型及peek示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • spring boot项目实战之实现与数据库的连接

    spring boot项目实战之实现与数据库的连接

    在我们日常的开发过程中,肯定不可避免的会使用到数据库以及SQL 语句,下面这篇文章主要给大家介绍了关于spring boot项目实战之实现与数据库连接的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 详解Springboot快速搭建跨域API接口的步骤(idea社区版2023.1.4+apache-maven-3.9.3-bin)

    详解Springboot快速搭建跨域API接口的步骤(idea社区版2023.1.4+apache-maven-3.9.

    这篇文章主要介绍了Springboot快速搭建跨域API接口(idea社区版2023.1.4+apache-maven-3.9.3-bin),本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • MyBatis分页插件PageHelper深度解析与实践指南

    MyBatis分页插件PageHelper深度解析与实践指南

    在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提供统一的分页解决方案,这正是PageHelper诞生的背景,下面小编给大家详细说说MyBatis分页插件PageHelper,需要的朋友可以参考下
    2025-05-05
  • Java实战宠物医院预约挂号系统的实现流程

    Java实战宠物医院预约挂号系统的实现流程

    只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql实现一个宠物医院预约挂号系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • Spring框架依赖注入方法示例

    Spring框架依赖注入方法示例

    这篇文章主要介绍了Spring框架依赖注入方法示例,分享了三种方法示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11

最新评论