当前位置: 首页 > article >正文

[架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)

[架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)

摘要:本文通过图文+代码实战,详细讲解Spring Boot整合MyBatis-Plus全流程,涵盖代码生成器、条件构造器、分页插件等核心功能,助你减少90%的SQL编写量,提升企业级开发效率。

一、MyBatis-Plus核心优势

1.1 功能对比(MyBatis vs MyBatis-Plus)

功能MyBatisMyBatis-Plus
通用CRUD操作需手写内置实现
分页插件需配置开箱即用
代码生成器可视化生成
逻辑删除手动处理注解支持
性能分析插件内置拦截器

1.2 核心功能架构图

MyBatis-Plus
基础CRUD
条件构造器
分页插件
代码生成器
全局ID生成

二、环境准备

2.1 必需依赖

<dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus Starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
</dependencies>

2.2 数据库准备

CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) DEFAULT NULL,`age` int DEFAULT NULL,`email` varchar(100) DEFAULT NULL,`is_deleted` tinyint(1) DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

三、四步完成基础整合

步骤1:配置数据源

# application.yml
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志

步骤2:创建实体类

@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableLogicprivate Integer isDeleted;
}

步骤3:创建Mapper接口

public interface UserMapper extends BaseMapper<User> {// 继承基础CRUD方法
}

步骤4:添加Mapper扫描

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

四、五大核心功能实战

4.1 基础CRUD操作

// 插入
User user = new User();
user.setName("CSDN");
userMapper.insert(user);// 查询
User result = userMapper.selectById(1L);// 分页查询
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, null);

4.2 条件构造器(QueryWrapper)

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "CSDN").between("age", 20, 30).orderByDesc("id");List<User> users = userMapper.selectList(wrapper);

4.3 逻辑删除配置

mybatis-plus:global-config:db-config:logic-delete-field: isDeleted  # 逻辑删除字段logic-delete-value: 1         # 删除标识值logic-not-delete-value: 0     # 未删除标识值

4.4 自动填充功能

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;// 实现MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());}
}

4.5 性能分析插件

@Bean
public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor interceptor = new PerformanceInterceptor();interceptor.setMaxTime(1000); // SQL执行最大时长(ms)interceptor.setFormat(true);  // 格式化SQLreturn interceptor;
}

五、企业级代码生成器

5.1 代码生成器配置

FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp_demo", "root", "123456").globalConfig(builder -> builder.author("CSDN")).packageConfig(builder -> builder.parent("com.example")).strategyConfig(builder -> builder.addInclude("user")).templateEngine(new FreemarkerTemplateEngine()).execute();

5.2 生成文件结构

src/main/java/com/example
├── entity
│   └── User.java
├── mapper
│   └── UserMapper.java
└── service├── UserService.java└── impl└── UserServiceImpl.java

六、高频问题解决方案

Q1:分页插件不生效?

  • 确认已配置分页插件Bean
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;
}

Q2:字段映射不一致?

  • 使用@TableField注解指定数据库字段名
@TableField("user_name")
private String name;

Q3:SQL日志不显示?

  • 检查配置项mybatis-plus.configuration.log-impl
  • 确保日志级别为DEBUG

七、性能优化建议

  1. 索引优化:为查询条件字段添加索引
  2. 批量操作:使用saveBatch替代循环插入
  3. SQL监控:集成Druid数据源监控
  4. 缓存策略:整合Redis二级缓存
@Bean
public MybatisRedisCacheFactory redisCacheFactory() {return new MybatisRedisCacheFactory(redisTemplate);
}

八、最佳实践总结

  1. 代码规范
    • 实体类字段使用包装类型(避免NPE)
    • Service层继承IService接口
  2. 安全建议
    • 禁用MP的DELETE全表操作
    mybatis-plus:global-config:db-config:block-attack: true
    
  3. 版本管理:锁定MyBatis-Plus版本

希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!

相关文章:

[架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)

[架构之美]Spring Boot集成MyBatis-Plus高效开发&#xff08;十七&#xff09; 摘要&#xff1a;本文通过图文代码实战&#xff0c;详细讲解Spring Boot整合MyBatis-Plus全流程&#xff0c;涵盖代码生成器、条件构造器、分页插件等核心功能&#xff0c;助你减少90%的SQL编写量…...

windows10 安装 QT

本地环境有个qt文件&#xff0c;这里是5.14.2 打开一个cmd窗口并指定到该文件根目录下 .\qt-opensource-windows-x86-5.14.2.exe --mirror https://mirrors.ustc.edu.cn/qtproject 执行上面命令 记住是文件名&#xff0c;记住不要傻 X的直接复制&#xff0c;是你的文件名 点击…...

WordPress 和 GPL – 您需要了解的一切

如果您使用 WordPress&#xff0c;GPL 对您来说应该很重要&#xff0c;您也应该了解它。查看有关 WordPress 和 GPL 的最全面指南。 您可能听说过 GPL&#xff08;通常被称为 WordPress 的权利法案&#xff09;&#xff0c;但很可能并不完全了解它。这是有道理的–这是一个复杂…...

计算机网络:什么是计算机网络?它的定义和组成是什么?

计算机网络是指通过通信设备和传输介质&#xff0c;将分布在不同地理位置的计算机、终端设备及其他网络设备连接起来&#xff0c;实现资源共享、数据传输和协同工作的系统。其核心目标是使设备之间能够高效、可靠地交换信息。 关键组成部分 硬件设备 终端设备&#xff1a;如计算…...

C++书本摆放 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析

目录 C++书本摆放 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、 推荐资料 1、C++资料 2、Scratch资料 3、Python资料 C++书本摆放 2024年信息素养大赛 C++复赛真题 一、题目要求 1、编程实现 中科智慧科技…...

在scala中使用sparkSQL读入csv文件

以下是使用 Spark SQL&#xff08;Scala&#xff09;读取 CSV 文件的完整代码示例&#xff1a; scala import org.apache.spark.sql.SparkSession import org.apache.spark.sql.types._object CSVReadExample {def main(args: Array[String]): Unit {// 创建SparkSessionval…...

RabbitMQ 核心概念与消息模型深度解析(一)

一、RabbitMQ 是什么 在当今分布式系统盛行的时代&#xff0c;消息队列作为一种至关重要的中间件技术&#xff0c;扮演着实现系统之间异步通信、解耦和削峰填谷等关键角色 。RabbitMQ 便是消息队列领域中的佼佼者&#xff0c;是一个开源的消息代理和队列服务器&#xff0c;基于…...

论文阅读笔记——双流网络

双流网络论文 视频相比图像包含更多信息&#xff1a;运动信息、时序信息、背景信息等等。 原先处理视频的方法&#xff1a; CNN LSTM&#xff1a;CNN 抽取关键特征&#xff0c;LSTM 做时序逻辑&#xff1b;抽取视频中关键 K 帧输入 CNN 得到图片特征&#xff0c;再输入 LSTM&…...

思路解析:第一性原理解 SQL:连接(JOIN)

目录 题目描述 &#x1f3af; 应用第一性原理来思考这个 SQL 题目 ✅ 第一步&#xff1a;还原每个事件的本质单位 ✅ 第二步&#xff1a;如果一个表只有事件&#xff0c;如何构造事件对&#xff1f; ✅ 第三步&#xff1a;加过滤条件&#xff0c;只保留“同一机器、同一进…...

Java面向对象三大特性深度解析

Java面向对象三大特性封装继承多态深度解析 前言一、封装&#xff1a;数据隐藏与访问控制的艺术1.1 封装的本质与作用1.2 封装的实现方式1.2.1 属性私有化与方法公开化1.2.2 封装的访问修饰符 二、继承&#xff1a;代码复用与类型扩展的核心机制2.1 继承的定义与语法2.2 继承的…...

LabVIEW在电子电工教学中的应用

在电子电工教学领域&#xff0c;传统教学模式面临诸多挑战&#xff0c;如实验设备数量有限、实验过程存在安全隐患、教学内容更新滞后等。LabVIEW 作为一款功能强大的图形化编程软件&#xff0c;为解决这些问题提供了创新思路&#xff0c;在电子电工教学的多个关键环节发挥着重…...

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标

1、定义icon组件代码&#xff1a; <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…...

生活破破烂烂,AI 缝缝补补(附提示词)

写在前面&#xff1a;​【Fire 计算器】已上线&#xff0c;快算算财富自由要多少​ 现实不总温柔&#xff0c;愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词&#xff08;供参考&#xff09;&#xff1a; 1. 逼真毛绒风 Transform this image into a hyperrealist…...

张 。。 通过Token实现Loss调优prompt

词编码模型和 API LLM不匹配,采用本地模型 理性中性案例(针对中性调整比较合理) 代码解释:Qwen2模型的文本编码与生成过程 这段代码展示了如何使用Qwen2模型进行文本的编码和解码操作。 模型加载与初始化 from transformers import AutoModelForCausalLM, AutoTokenizer...

Ubuntu 22.04.5 LTS上部署Docker及相关优化

以下是在Ubuntu 22.04.5 LTS上部署Docker及相关优化的步骤&#xff1a; 安装Docker 更新系统&#xff1a;在安装Docker之前&#xff0c;先确保系统是最新的&#xff0c;执行以下命令&#xff1a;sudo apt update sudo apt upgrade -y安装依赖包&#xff1a;安装一些必要的依赖…...

JVM学习专题(一)类加载器与双亲委派

目录 1、JVM加载运行全过程梳理 2、JVM Hotspot底层 3、war包、jar包如何加载 4、类加载器 我们来查看一下getLauncher&#xff1a; 1.我们先查看getExtClassLoader() 2、再来看看getAppClassLoader(extcl) 5、双亲委派机制 1.职责明确&#xff0c;路径隔离​&#xff…...

PyTorch API 9 - masked, nested, 稀疏, 存储

文章目录 torch.randomtorch.masked简介动机什么是 MaskedTensor&#xff1f; 支持的运算符一元运算符二元运算符归约操作查看与选择函数 torch.nested简介构造方法数据布局与形状支持的操作查看嵌套张量的组成元素填充张量的相互转换形状操作注意力机制 与 torch.compile 的配…...

进程相关面试题20道

一、基础概念与原理 1.进程的定义及其与程序的本质区别是什么&#xff1f; 答案&#xff1a;进程是操作系统分配资源的基本单位&#xff0c;是程序在数据集合上的一次动态执行过程。核心区别&#xff1a;​ 动态性&#xff1a;程序是静态文件&#xff0c;进程是动态执行实例…...

微信小程序学习之轮播图swiper

轮播图是小程序的重要组件&#xff0c;我们还是好好学滴。 1、上代码&#xff0c;直接布局一个轮播图组件(index.wxml)&#xff1a; <swiper class"swiper" indicator-active-color"#fa2c19" indicator-color"#fff" duration"{{durati…...

【万字逐行详解】深入解析ONNX Runtime图像分类程序main函数

本文将全面、详尽地解析一个使用ONNX Runtime进行图像分类的C++程序,不省略任何一行代码,逐行解释其语法和实现原理。这个程序展示了现代C++在计算机视觉领域的完整应用流程,从模型加载到结果可视化,涵盖了异常处理、性能分析等工程实践。 程序完整解析 1. 主函数框架 i…...

Linux复习笔记(五) 网络服务配置(dhcp)

二、网络服务配置 2.5 dhcp服务配置&#xff08;不涉及实际操作&#xff09; 要求&#xff1a;知道原理和常见的参数配置就行 2.5.1 概述DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; DHCP&#xff08;Dynamic Host Conf…...

智慧工厂管理平台推荐?智慧工厂解决方案提供商有哪些?智慧工厂管理系统哪家好?

随着工业4.0和“双碳”目标的推进&#xff0c;智慧工厂管理平台成为制造企业数字化转型的核心工具。本文基于技术实力、应用场景、安全可靠三大维度&#xff0c;结合最新行业实践与用户需求&#xff0c;精选出十大智慧工厂解决方案提供商&#xff0c;助您快速匹配行业需求&…...

鸿蒙OSUniApp 实现的语音输入与语音识别功能#三方框架 #Uniapp

UniApp 实现的语音输入与语音识别功能 最近在开发跨平台应用时&#xff0c;客户要求添加语音输入功能以提升用户体验。经过一番调研和实践&#xff0c;我成功在UniApp项目中实现了语音输入与识别功能&#xff0c;现将过程和方法分享出来&#xff0c;希望对有类似需求的开发者有…...

windows版redis的使用

redis下载 Releases microsoftarchive/redishttps://github.com/microsoftarchive/redis/releases redis的启动和停止 进入路径的cmd 启动&#xff1a;redis-server.exe redis.windows.conf 停止&#xff1a;ctrlc 连接redis 指定要连接的IP和端口号 -h IP地址 -p 端口…...

Java版OA管理系统源码 手机版OA系统源码

Java版OA管理系统源码 手机版OA系统源码 一&#xff1a;OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作&#xff0c;自动化处理常规事务&#xff0c;缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本&#xff0c;优化资源分配。 3. 规范管理 固化企…...

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级

NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强‌等升级&#xff0c;进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移&#xff0c;还是多环境的数据管理&#xff0c;NineData…...

进阶2_1:QT5多线程与定时器共生死

1、在widget.ui中使用 LCD Number控件 注意&#xff1a;若 LCD 控件不是多线程&#xff0c;LCD控件则会瞬间自增到最大的数值&#xff0c;如上图&#xff0c;说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h&#xff0c;对任务类…...

在虚拟机Ubuntu18.04中安装NS2教程及应用

NS2简介 一、主要组成部分&#xff1a; 1.NS2&#xff1a;模拟器本身&#xff0c;负责执行TCL脚本进行模拟&#xff0c;并生成trace文件输出结果。 2.NAM&#xff1a;网络动画模拟器&#xff0c;用于将模拟结果可视化。 二、使用的语言&#xff1a; 1.C&#xff1a;NS2中最重要…...

VBA —— 第6章子程序与函数

子程序&#xff1a;实现特定功能的程序代码块 子程序语法&#xff1a; [修饰符] Sub 子程序名称([参数1&#xff0c;参数2&#xff0c;参数3]) 代码块 End Sub 子程序如何调用&#xff1a; 1 . 子程序名 [参数1&#xff0c;参数2&#xff0c;...] 2. Call 子程序名 [(参…...

MySQL知识点总结(持续更新)

聚合函数通常用于对数据进行统计和聚合操作。以下是一些常见数据库系统&#xff08;如 MySQL、PostgreSQL、Oracle、SQL Server 等&#xff09;中常用的聚合函数&#xff1a; 常见的数据库聚合函数&#xff1a; COUNT()&#xff1a;计算指定列中非空值的数量 SELECT COUNT(*) …...