java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot 集成 MyBatis/MyBatis-Plus

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

作者:顾北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 核心组件

SpringBoot集成Mybatis

环境准备

MyBatis-Spring-Boot-Starter

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

核心优势:

创建项目并集成:

第一步,创建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:

    <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 原有代码。

核心优势

框架结构:

Lombok简介

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

导入依赖:

<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;  //修改时间
}

编写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);
        }
    }
}

常用注解

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

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

@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>接口中:

说明:

条件构造器:

条件构造器(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 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文