完整教程:MyBatis-Plus使用详解

news/2025/11/30 22:10:52/文章来源:https://www.cnblogs.com/gccbuaa/p/19290570

一、什么是 MyBatis-Plus?

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

核心特性:

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。

  2. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。

  3. 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。

  4. 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。

  5. 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题。

  6. 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。

  7. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件后,写分页等同于普通 List 查询。

  8. 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。

  9. 内置全局拦截插件:提供全表 deleteupdate 操作智能分析阻断,也可自定义拦截规则,预防误操作。

  10. 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库。

二、快速入门

1. 添加依赖

以 Spring Boot 项目为例,在 pom.xml 中添加:

org.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-testtestcom.baomidoumybatis-plus-boot-starter3.5.6 mysqlmysql-connector-java8.0.33org.projectlomboklomboktrue
2. 配置

在 application.yml 中配置数据源和 MyBatis-Plus:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: 123456
# MyBatis-Plus 配置
mybatis-plus:configuration:# 在控制台打印SQL日志,便于调试log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 全局逻辑删除的实体字段名 (since 3.3.0)logic-delete-field: deleted# 逻辑已删除值(默认为 1)logic-delete-value: 1# 逻辑未删除值(默认为 0)logic-not-delete-value: 0# 主键类型。AUTO-数据库ID自增,INPUT-自行设置,ASSIGN_ID-雪花算法,ASSIGN_UUID-UUIDid-type: ASSIGN_ID
3. 创建实体类

使用 Lombok 注解简化代码。

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("sys_user") // 指定表名,如果表名和类名一致(忽略大小写和下划线)可省略
public class User {/*** 主键*/@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法生成IDprivate Long id;/*** 用户名*/private String name;/*** 年龄*/private Integer age;/*** 邮箱*/private String email;/*** 创建时间*/@TableField(fill = FieldFill.INSERT) // 插入时自动填充private LocalDateTime createTime;/*** 更新时间*/@TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新时自动填充private LocalDateTime updateTime;/*** 逻辑删除字段 (0-未删除, 1-已删除)*/@TableLogicprivate Integer deleted;
}

注解说明:

  • @TableName:表名注解。

  • @TableId:主键注解。IdType 常用值:

    • AUTO:数据库 ID 自增。

    • ASSIGN_ID:雪花算法生成 Long 类型的 ID(默认策略)。

    • ASSIGN_UUID:生成 UUID。

  • @TableField:字段注解。

    • fill:字段自动填充策略。FieldFill.INSERT(插入时填充),FieldFill.UPDATE(更新时填充),FieldFill.INSERT_UPDATE(插入和更新时都填充)。

    • value:数据库字段名(如果属性名和字段名符合驼峰命名规则,可省略)。

  • @TableLogic:逻辑删除注解。

4. 创建 Mapper 接口

继承 MyBatis-Plus 提供的 BaseMapper 接口。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
// 指定对应的实体类
public interface UserMapper extends BaseMapper {// 此时,已经拥有了 BaseMapper 中所有的基本 CRUD 方法// 无需编写 XML 文件
}

别忘了在启动类上添加 @MapperScan 注解:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口所在的包
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
5. 测试

编写一个测试类,注入 UserMapper 进行测试。

import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class DemoApplicationTests {@Autowiredprivate UserMapper userMapper;@Testvoid testSelect() {System.out.println("----- 查询所有用户 ------");List userList = userMapper.selectList(null);userList.forEach(System.out::println);}@Testvoid testInsert() {User user = new User();user.setName("张三");user.setAge(25);user.setEmail("zhangsan@example.com");int result = userMapper.insert(user);System.out.println("插入影响行数: " + result);System.out.println("生成的主键ID: " + user.getId());}@Testvoid testUpdate() {User user = new User();user.setId(1L);user.setAge(26);int result = userMapper.updateById(user);System.out.println("更新影响行数: " + result);}@Testvoid testDelete() {int result = userMapper.deleteById(1L);System.out.println("删除影响行数: " + result);}
}

三、核心功能详解

1. 条件构造器 Wrapper

Wrapper 是 MyBatis-Plus 最核心的功能之一,用于构建复杂的 SQL WHERE 条件。推荐使用 LambdaQueryWrapper,避免硬编码字段名。

@Test
void testQueryWrapper() {// 1. 查询年龄大于20且邮箱不为空的用户LambdaQueryWrapper wrapper1 = new LambdaQueryWrapper<>();wrapper1.gt(User::getAge, 20).isNotNull(User::getEmail);List userList1 = userMapper.selectList(wrapper1);// 2. 查询名字包含"张"且年龄小于30的用户LambdaQueryWrapper wrapper2 = new LambdaQueryWrapper<>();wrapper2.like(User::getName, "张").lt(User::getAge, 30);List userList2 = userMapper.selectList(wrapper2);// 3. 按年龄降序排序LambdaQueryWrapper wrapper3 = new LambdaQueryWrapper<>();wrapper3.orderByDesc(User::getAge);List userList3 = userMapper.selectList(wrapper3);// 4. 只查询指定的字段 (SELECT id, name FROM user ...)LambdaQueryWrapper wrapper4 = new LambdaQueryWrapper<>();wrapper4.select(User::getId, User::getName);List userList4 = userMapper.selectList(wrapper4);
}
2. 自定义 SQL

对于复杂的多表关联查询,仍然需要编写 XML 或注解形式的 SQL。

Mapper 接口:

public interface UserMapper extends BaseMapper {// 使用注解方式@Select("SELECT u.*, d.department_name FROM sys_user u LEFT JOIN sys_department d ON u.dept_id = d.id WHERE u.id = #{id}")User selectUserWithDepartment(Long id);// 使用 XML 方式 (推荐复杂SQL)User selectComplexUser(@Param("ew") Wrapper wrapper);
}

XML 文件 (UserMapper.xml):


3. 分页查询

首先需要配置分页插件。

配置类:

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

使用分页:

@Test
void testPage() {// 参数:当前页,每页大小Page page = new Page<>(1, 5);LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();wrapper.gt(User::getAge, 20);// 执行查询Page userPage = userMapper.selectPage(page, wrapper);System.out.println("总记录数: " + userPage.getTotal());System.out.println("总页数: " + userPage.getPages());System.out.println("当前页数据: ");userPage.getRecords().forEach(System.out::println);
}
4. 通用 Service

MyBatis-Plus 提供了通用的 IService 接口及其实现类 ServiceImpl,进一步封装了常用服务层操作。

1. 创建 Service 接口:

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService {// 可以在这里定义自定义方法User getCustomUserById(Long id);
}

2. 创建 Service 实现类:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {@Overridepublic User getCustomUserById(Long id) {// 这里可以写复杂的业务逻辑return this.getById(id);}
}

3. 使用 Service:

@Autowired
private UserService userService;
@Test
void testService() {// 保存User user = new User();user.setName("李四");userService.save(user);// 批量查询List list = userService.list();// 链式查询List users = userService.lambdaQuery().gt(User::getAge, 20).like(User::getName, "张").list();
}
5. 自动填充(如创建时间、更新时间)

实现 MetaObjectHandler 接口。

1. 创建填充处理器:

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 插入时自动填充this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {// 更新时自动填充this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}

2. 在实体类字段上添加 @TableField 注解(见上文实体类示例)。

6. 逻辑删除

配置好全局逻辑删除(见上文 application.yml 配置)和在实体类字段上添加 @TableLogic 注解后,所有删除操作将自动变为更新操作,将 deleted 字段设置为 1。查询操作会自动带上 deleted = 0 的条件。

userMapper.deleteById(1L); // 实际执行的是 UPDATE user SET deleted=1 WHERE id=1 AND deleted=0
userMapper.selectList(null); // 实际执行的是 SELECT ... FROM user WHERE deleted=0

四、常用配置

一个更完整的 application.yml 配置示例:

mybatis-plus:# 配置 XML 文件位置mapper-locations: classpath*:/mapper/**/*.xml# 配置类型别名包type-aliases-package: com.example.demo.entityconfiguration:# 开启驼峰命名自动映射map-underscore-to-camel-case: true# 日志实现log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 配置JdbcTypeForNull,解决 updateById(id, null) 时,字段不更新问题jdbc-type-for-null: 'null'global-config:db-config:# 主键类型id-type: ASSIGN_ID# 逻辑删除字段名logic-delete-field: deleted# 逻辑已删除值logic-delete-value: 1# 逻辑未删除值logic-not-delete-value: 0# 表名前缀(如果所有表都有共同前缀,可以在此配置)# table-prefix: t_

五、总结

MyBatis-Plus 通过以下方式极大地提升了开发效率:

  1. 开箱即用:继承 BaseMapper / IService 即可获得绝大部分单表 CRUD 方法。

  2. 条件构造器:使用 LambdaQueryWrapper 以 Lambda 形式安全、优雅地构建复杂查询条件。

  3. 代码生成器(本文未展开):可以快速生成 Entity、Mapper、Service、Controller 等全套代码。

  4. 内置插件:分页、性能分析、乐观锁、逻辑删除等常用功能都已内置。

  5. 无侵入性:与原生 MyBatis 完美共存,原有代码不受任何影响。

对于大多数业务场景,使用 MyBatis-Plus 可以让你告别简单的 CRUD 编写工作,更专注于核心业务逻辑的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/982301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20232312 2025-2026-1 《网络与系统攻防技术》实验七实验报告

20232312 2025-2026-1 《网络与系统攻防技术》实验七实验报告 1.实验内容 (1)用SET工具建立冒名网站 (2)用Ettercap工具实现的DNS欺骗攻击 (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 2.实验过程…

20232424 2025-2026-1 《网络与系统攻防技术》实验七实验报告

20232424 2025-2026-1 《网络与系统攻防技术》实验七实验报告 1.实验内容 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 (4)理解常用网络…

peak物品生成列表对照

A - BAirplane Food - 飞机餐AloeVera - 芦荟AncientIdol -以此类推... (Ancient Idol) 古代神像Anti-Rope Spool - 反向绳索卷轴Antidote - 解毒剂Apple Berry Green - 绿苹果莓Apple Berry Red - 红苹果莓Apple Berr…

EverEdit 提供了强大的函数提示功能

EverEdit 提供了强大的函数提示功能(CallTip),能够在用户输入函数时自动显示其使用说明,显著提升编码效率。以下是相关功能的详细介绍: 1. 函数提示的触发与显示当用户输入函数名称及左括号(如 function()时,E…

NOIP2025游寄

其实并没有什么不满足的。 毕竟我成为一名OIer,也就三个月的事情而已。 万恶之源 GS的土地上生长不出OI的花朵。 唯一能系统性教授的是金城“最好”的那所初中。 lsh也是两年外省集训才拿的银。 而我被信息差打得一塌…

FastAPI(TortoiseORM+Aerich)和Flask(sqlalchemy+Migrate)数据库持久化

一、FastAPI(TortoiseORM+Aerich) demo项目结构:(migrations和pyproject.toml是持久化后生成的文件) pip install tortoise_orm pip install aerich 1.初始化数aerich配置,确定访问的数据库源,以及包含的models…

2025年长春笔记本电脑售后维修点推荐:联想华硕戴尔等品牌哪家更靠谱?全方位评测与用户口碑解析

随着数字化转型加速,笔记本电脑已成为现代工作学习的重要工具。根据中国电子信息产业发展研究院发布的2024年数码产品维修服务行业报告,笔记本电脑故障率年均达18.7%,其中硬件故障占比62.3%。面对联想、华硕、戴尔、…

详细介绍:汽车尾气检测的 “黄金标准”:HORIBA MEXA-584L 全功能汽车排放废气分析仪技术解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验心得

软件构造实验作业 实验名称: 班级:信2305-2 学号:20234306 姓名:陈柏龙 实验一:AI故事生成平台 一、实验要求 实验一:AI故事生成平台(2025.11.13日完成) 实验名称: AI故事生成平台 - 核心数据模…

【人工智能数学基础】什么是高斯分布/正态分布? - 教程

【人工智能数学基础】什么是高斯分布/正态分布? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

2025年南京笔记本电脑售后维修点推荐:华硕惠普宏碁等品牌哪家更可靠?行业数据与服务质量比对

随着笔记本电脑在工作和生活中的普及,2025年南京市场维修需求持续增长。根据中国家用电器服务维修协会数据,笔记本电脑故障率年均增长15%,其中硬件故障占比达62%。面对联想、华硕、戴尔、惠普、宏碁、微软、三星等主…

为什么硬盘的容量宣传与实际不一致?

为什么硬盘的容量宣传与实际不一致?【硬盘厂商算法】2TB=2*1000(GB)=2*1000*1000(MB)=2*1000*1000*1000(KB)=2*1000*1000*1000*1000(Byte)【操作系统算法】2*1000*1000*1000*1000(Byte)=2*1000*1000*1000*1000/1024(K…

macos系统安装java

首先进入https://adoptium.net/zh-CN这个网站 点击下载 Temurin 会根据电脑配置自动下载最新的java版本这里我选择的是其他版本下载 选择了此版本 Temurin 25.0.1+8-LTS, macOS aarch64 (M1) (.PKG) 下载完后根据只是下…

windows部署ruoyiAI应用-nginx配置后台管理端和用户管理端

我这里用到一个很方便的工具-phpstudy 首先需要去官网下载phpstudy工具https://m.xp.cn/phpstudy 一、首页-->nginx启动 二、网站-->创建域名admin端口8081和域名web端口8082 三、每个域名和端口配置对应的根目录…

2025年南京笔记本电脑售后维修点推荐:哪个性价比最高?多品牌维修点对比与选购指南

随着笔记本电脑在工作和生活中的普及,2025年南京市场笔记本保有量预计突破500万台(数据来源:江苏省电子信息行业协会2024年度报告),售后维修需求持续增长。然而消费者面临维修点选择困难、服务质量参差不齐等痛点…

JavaScript 网页交互进阶:5 个经典案例实现(二)—— 覆盖 UI 组件开发与工具函数封装 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年南通笔记本维修点推荐:哪个口碑更优?惠普宏碁三星等品牌用户评价分析

随着数字化转型加速,笔记本电脑已成为工作学习不可或缺的工具。根据中国电子信息产业发展研究院数据,2025年南通地区笔记本电脑保有量预计突破120万台,年维修需求增长率达15%。面对突发黑屏、系统故障等痛点,用户亟…