Mybatis-Plus基本功能详解 📅 发布时间:2026/7/5 2:21:09 👁️ 浏览次数: 一、为什么选择 MyBatis-PlusMyBatis 虽然灵活但需要手动编写大量 XML 映射文件或注解 SQL而 MyBatis-Plus 解决了这些痛点无侵入完全兼容 MyBatis原有代码无需修改即可升级。CRUD 自动生成内置通用 Mapper/Service单表操作无需写 SQL。强大的条件构造器支持链式调用轻松构建复杂查询条件。自动分页无需手动处理分页参数分页查询一键实现。逻辑删除无需修改 SQL自动处理软删除逻辑。代码生成器一键生成 Entity、Mapper、Service、Controller 全套代码。二、环境搭建Spring Boot 整合1. 引入依赖在 pom.xml 中添加 MyBatis-Plus 核心依赖以 MySQL 为例!-- Spring Boot 父工程 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.10/version relativePath/ /parent !-- 核心依赖 -- dependencies !-- MyBatis-Plus 核心包 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- Lombok简化实体类 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- Spring Boot 测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies2. 配置数据库连接在 application.yml 中配置数据库和 MyBatis-Plus 基本信息spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 # MyBatis-Plus 配置 mybatis-plus: # 实体类别名包扫描 type-aliases-package: com.example.mpdemo.entity # 配置 mapper.xml 扫描路径可选 mapper-locations: classpath:mapper/**/*.xml # 日志配置方便调试 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 全局配置 global-config: db-config: # 主键自增策略 id-type: auto # 逻辑删除字段名可选 logic-delete-field: isDeleted # 逻辑删除-未删除值 logic-not-delete-value: 0 # 逻辑删除-已删除值 logic-delete-value: 13. 启动类添加注解在 Spring Boot 启动类上添加 MapperScan扫描 Mapper 接口包import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication // 扫描 Mapper 接口所在包 MapperScan(com.example.mpdemo.mapper) public class MpDemoApplication { public static void main(String[] args) { SpringApplication.run(MpDemoApplication.class, args); } }三、核心功能实战1. 基础 CRUD 操作无需写 SQL步骤 1创建实体类以 User 表为例使用 Lombok 简化代码import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; Data // Lombok 自动生成 getter/setter/toString 等 TableName(user) // 指定数据库表名若类名与表名一致可省略 public class User { // 主键对应全局配置的 auto 自增 TableId(type IdType.AUTO) private Long id; // 用户名若字段名与属性名一致可省略 TableField private String username; // 密码 private String password; // 年龄 private Integer age; // 邮箱 private String email; // 逻辑删除字段 TableLogic private Integer isDeleted; // 创建时间自动填充 TableField(fill FieldFill.INSERT) private LocalDateTime createTime; // 更新时间自动填充 TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }步骤 2创建 Mapper 接口继承 BaseMapper自动获得 CRUD 方法import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mpdemo.entity.User; import org.apache.ibatis.annotations.Mapper; Mapper public interface UserMapper extends BaseMapperUser { // 无需写任何代码BaseMapper 已包含所有单表 CRUD }步骤 3测试 CRUD 操作import com.example.mpdemo.entity.User; import com.example.mpdemo.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 public class CrudTest { Autowired private UserMapper userMapper; // 新增 Test public void testInsert() { User user new User(); user.setUsername(张三); user.setPassword(123456); user.setAge(20); user.setEmail(zhangsantest.com); // 插入数据返回受影响行数 int rows userMapper.insert(user); System.out.println(新增成功受影响行数 rows 主键ID user.getId()); } // 查询单个 Test public void testSelectById() { User user userMapper.selectById(1L); System.out.println(user); } // 查询所有 Test public void testSelectList() { ListUser userList userMapper.selectList(null); // null 表示无查询条件 userList.forEach(System.out::println); } // 更新 Test public void testUpdateById() { User user new User(); user.setId(1L); user.setAge(21); // 只更新年龄 int rows userMapper.updateById(user); System.out.println(更新成功受影响行数 rows); } // 删除物理删除 Test public void testDeleteById() { int rows userMapper.deleteById(1L); System.out.println(删除成功受影响行数 rows); } // 逻辑删除实际执行 update将 isDeleted 设为 1 Test public void testLogicDelete() { int rows userMapper.deleteById(2L); System.out.println(逻辑删除成功受影响行数 rows); } }2. 条件构造器Wrapper构建复杂查询QueryWrapper/LambdaQueryWrapper 是 MP 最强大的功能之一支持链式构建查询条件import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.mpdemo.entity.User; 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 public class WrapperTest { Autowired private UserMapper userMapper; // 基础 QueryWrapper字符串字段名易出错 Test public void testQueryWrapper() { QueryWrapperUser wrapper new QueryWrapper(); // 年龄大于 18 且用户名包含 张 且邮箱不为空 wrapper.gt(age, 18) .like(username, 张) .isNotNull(email); ListUser userList userMapper.selectList(wrapper); userList.forEach(System.out::println); } // LambdaQueryWrapper类型安全推荐 Test public void testLambdaQueryWrapper() { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); // 避免手写字段名防止拼写错误 wrapper.gt(User::getAge, 18) .like(User::getUsername, 张) .isNotNull(User::getEmail); ListUser userList userMapper.selectList(wrapper); userList.forEach(System.out::println); } // 分页查询 Test public void testPage() { // 1. 构建分页条件第 1 页每页 10 条 PageUser page new Page(1, 10); // 2. 构建查询条件 LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.gt(User::getAge, 18); // 3. 执行分页查询 PageUser resultPage userMapper.selectPage(page, wrapper); // 4. 获取分页结果 System.out.println(总记录数 resultPage.getTotal()); System.out.println(总页数 resultPage.getPages()); System.out.println(当前页数据); resultPage.getRecords().forEach(System.out::println); } }3. 自动填充创建 / 更新时间实现 MetaObjectHandler自动填充创建时间和更新时间import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; Component // 必须交给 Spring 管理 public class MyMetaObjectHandler implements MetaObjectHandler { // 插入时填充 Override public void insertFill(MetaObject metaObject) { // 填充 createTime 和 updateTime this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } // 更新时填充 Override public void updateFill(MetaObject metaObject) { // 只填充 updateTime this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }4. 代码生成器一键生成全套代码MP 提供代码生成器可快速生成 Entity、Mapper、Service、Controller减少重复工作。引入代码生成器依赖!-- MyBatis-Plus 代码生成器 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.5.3.1/version /dependency !-- 模板引擎Freemarker -- dependency groupIdorg.freemarker/groupId artifactIdfreemarker/artifactId version2.3.31/version /dependency编写生成器代码import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import java.util.Collections; public class CodeGenerator { public static void main(String[] args) { // 数据库连接配置 String url jdbc:mysql://localhost:3306/mp_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai; String username root; String password 123456; // 快速生成代码 FastAutoGenerator.create(url, username, password) // 全局配置 .globalConfig(builder - { builder.author(你的名字) // 设置作者 .outputDir(System.getProperty(user.dir) /src/main/java) // 输出目录 .enableSwagger() // 开启 Swagger可选 .commentDate(yyyy-MM-dd) // 注释日期格式 .disableOpenDir(); // 生成后不打开文件夹 }) // 包配置 .packageConfig(builder - { builder.parent(com.example.mpdemo) // 父包名 .moduleName() // 模块名无则空 .entity(entity) // 实体类包名 .mapper(mapper) // Mapper 包名 .service(service) // Service 包名 .controller(controller) // Controller 包名 .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty(user.dir) /src/main/resources/mapper)); // Mapper XML 路径 }) // 策略配置 .strategyConfig(builder - { builder.addInclude(user) // 要生成的表名多个用逗号分隔 .addTablePrefix(t_, sys_) // 忽略表前缀如 t_user → User // 实体类策略 .entityBuilder() .enableLombok() // 启用 Lombok .enableTableFieldAnnotation() // 生成字段注解 // Controller 策略 .controllerBuilder() .enableRestStyle() // 生成 RestController .enableHyphenStyle() // URL 中驼峰转连字符如 userInfo → user-info // Service 策略 .serviceBuilder() .formatServiceFileName(%sService) // Service 命名规则 .formatServiceImplFileName(%sServiceImpl); }) // 模板引擎Freemarker .templateEngine(new FreemarkerTemplateEngine()) // 执行生成 .execute(); } }四、进阶技巧1. 自定义 SQL若 MP 内置方法无法满足需求可自定义 SQL兼容 MyBatis 写法// UserMapper.java Select(SELECT * FROM user WHERE age #{age}) ListUser selectByAge(Param(age) Integer age); // 或在 UserMapper.xml 中编写 select idselectByAge resultTypecom.example.mpdemo.entity.User SELECT * FROM user WHERE age #{age} /select2. 多表关联查询MP 不直接支持多表关联但可通过 Select 注解或 XML 实现结合 Wrapper 灵活拼接条件。3. 乐观锁解决并发更新问题步骤实体类添加版本字段 VersionVersionprivate Integer version;配置乐观锁插件import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
春联生成模型-中文-base保姆级教程:日志排查、错误码解读与热重载配置 春联生成模型-中文-base保姆级教程:日志排查、错误码解读与热重载配置 1. 快速了解春联生成模型 春联生成模型是一个专门为春节对联场景设计的AI模型,基于达摩院AliceMind团队的基础生成大模型开发。你只需要输入两个字的祝福词,比如"… 2026/7/5 6:51:33
Qwen-Turbo-BF16艺术创作:数字油画生成合集 Qwen-Turbo-BF16艺术创作:数字油画生成合集 用AI画笔,让创意在数字画布上自由流淌 最近体验了Qwen-Turbo-BF16在数字艺术创作方面的能力,不得不说,这个模型在生成各种风格的数字油画作品上确实让人眼前一亮。作为一个专注于图像生… 2026/5/17 10:18:24
Qwen3-Reranker-4B提示词工程:提升重排序效果的技巧 Qwen3-Reranker-4B提示词工程:提升重排序效果的技巧 1. 引言 当你面对一堆搜索结果或文档列表时,如何快速找到最相关的内容?这就是重排序模型要解决的问题。Qwen3-Reranker-4B作为一个强大的重排序模型,能够智能地判断文档与查询… 2026/5/17 10:18:22
【复现】基于噪声抑制半监督学习的锂离子电池SOH估计方法(Python代码实现) 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 🎁… 2026/7/5 6:53:58
【全国二级三级等保】等保测评2.0! 等保2.0!!!全国二级三级等保测评❌ 低价代办:只给文档模板,测评、整改全另收费,报告无法备案,处处隐形消费❌ 单纯咨询服务:只出方案,没人陪测、没人跟进复测,服务单一✅ 我们等保一站式落地&am… 2026/7/5 6:53:58
免费开源AMD Ryzen调试神器:3分钟上手SMUDebugTool硬件掌控完全指南 免费开源AMD Ryzen调试神器:3分钟上手SMUDebugTool硬件掌控完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址… 2026/7/5 6:51:58
静音直流电机控制方案:TB9051FTG与PIC18LF46K42应用 1. 项目概述:静音直流电机控制方案在工业自动化和消费电子领域,直流电机的噪声问题一直是工程师面临的挑战。传统PWM控制方式虽然简单高效,但开关噪声和电磁干扰(EMI)问题严重影响设备的使用体验。本项目采用东芝TB9051FTG电机驱动IC与Microc… 2026/7/5 6:51:58
【2027最新】基于SpringBoot+Vue的智慧党建系统管理系统源码+MyBatis+MySQL 博主介绍:👨🎓博主简介 ❤计算机在读硕士 | CSDN 专业博客 | Java 技术布道者 ❤深耕实验室一线,痴迷 Spring Boot 与前后端分离架构,累计原创技术博文 200 篇; ❤手把手指导毕业设计 1000 项,… 2026/7/5 6:49:57
IS31FL3731 LED驱动与R7FA6M3AH3CFC MCU开发指南 1. IS31FL3731 LED驱动芯片深度解析IS31FL3731是一款由Lumissil Microsystems公司推出的高性能LED驱动芯片,专为控制144个单色LED而设计。这款芯片通过I2C接口进行编程控制,具有两个独立的控制区块,每个区块可独立管理72个LED。其核心特性包括… 2026/7/5 6:49:57
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36