MyBatisPlus 用法详解
MyBatisPlus 用法详解
MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,包括强大的CRUD操作、条件构造器、自动填充、分页插件等,极大地简化了开发工作。以下是对MyBatis-Plus的详细用法介绍。
一、MyBatis-Plus简介
MyBatis-Plus的官网地址为:https://mybatis.plus/ 或 https://mp.baomidou.com/。
MyBatis-Plus的主要特性包括:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。
- 损耗小:启动即会自动注入基本CRUD,性能基本无损耗,直接面向对象操作。
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
- 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件,无需再担心字段写错。
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-Sequence),可自由配置,完美解决主键问题。
- 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。
- 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
- 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置。
- 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
- 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
二、MyBatis-Plus基本使用
1. 引入依赖
MyBatis-Plus提供了starter,实现了自动Mybatis以及MyBatis-Plus的自动装配功能。在Maven项目的pom.xml
文件中添加以下依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本号</version>
</dependency>
注意:尽量不要同时导入MyBatis和MyBatis-Plus,避免版本差异。
2. 配置数据库连接
在application.yml
或application.properties
文件中配置数据库连接信息。例如,使用application.yml
文件:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8username: 账号password: 密码
3. 使用
在Spring Boot启动类中添加@MapperScan
注解,扫描Mapper文件夹:
@SpringBootApplication
@MapperScan("com.example.mapper") // 替换为你的Mapper所在的类路径
public class MyBatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MyBatisPlusApplication.class, args);}
}
在对应的Mapper上面添加@Mapper
注解,并继承BaseMapper<>
类:
@Mapper
public interface UserMapper extends BaseMapper<User> {// 所有的CRUD都已经完成,不需要像以前一样配置一大堆文件
}
其中,User
是实体类,对应数据库中的一张表。
4. 编写实体类
实体类通常使用Lombok库来简化代码。例如:
import lombok.Data;@Data
public class User {private Long id;private String name;private Integer age;// 其他字段...
}
MyBatis-Plus会根据PO实体(BaseMapper<T>
中的T
)的信息来推断出表的信息,从而生成SQL。默认情况下,MyBatis-Plus会把PO实体的类名驼峰转下划线作为表名,把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型。如果默认实现与实际场景不符,可以使用注解来声明表信息。
- @TableName:标识实体类对应的表。当实体类的名称和表名的命名不一致时使用。
- @TableId:标识实体类中的主键字段。如果主键字段的命名符合规范(如
id
),则不需要使用该注解。 - @TableField:标识实体类中的普通属性。当实体类的命名和数据库的字段名有出入时使用。
三、CRUD操作
MyBatis-Plus提供了丰富的CRUD操作方法,这些方法都定义在BaseMapper
接口中。
1. 插入
使用insert
方法插入一条记录:
User user = new User();
user.setName("张三");
user.setAge(18);
// 其他字段设置...
userMapper.insert(user);
2. 删除
使用deleteById
方法根据主键删除一条记录:
userMapper.deleteById(1L);
使用deleteBatchIds
方法根据主键批量删除记录:
List<Long> ids = Arrays.asList(1L, 2L, 3L);
userMapper.deleteBatchIds(ids);
3. 更新
使用updateById
方法根据主键更新一条记录:
User user = new User();
user.setId(1L);
user.setName("李四");
// 其他字段设置(需要更新的字段)...
userMapper.updateById(user);
4. 查询
使用selectById
方法根据主键查询一条记录:
User user = userMapper.selectById(1L);
使用selectList
方法查询所有记录:
List<User> userList = userMapper.selectList(null);
使用条件构造器Wrapper
进行复杂查询。例如,查询年龄大于18岁的用户:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18);
List<User> userList = userMapper.selectList(queryWrapper);
四、条件构造器
MyBatis-Plus提供了强大的条件构造器,用于构建复杂的查询条件。条件构造器的核心类是Wrapper
,其子类包括QueryWrapper
和UpdateWrapper
。
1. 基本比较操作
使用eq
、ne
、gt
、ge
、lt
、le
等方法进行基本比较操作。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三"); // 等价于 WHERE name = '张三'
queryWrapper.ne("age", 18); // 等价于 WHERE age <> 18
2. 模糊查询
使用like
、notLike
、likeLeft
、likeRight
等方法进行模糊查询。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张"); // 等价于 WHERE name LIKE '%张%'
3. 排序
使用orderByAsc
、orderByDesc
等方法进行排序。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("age"); // 等价于 ORDER BY age ASC
4. 逻辑查询
使用and
、or
、nested
等方法进行逻辑查询。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.and(wrapper -> wrapper.eq("name", "张三").ne("age", 18));
// 等价于 WHERE (name = '张三' AND age <> 18)
5. select
使用select
方法指定查询的字段。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name", "age"); // 只查询name和age字段
List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
五、ActiveRecord
MyBatis-Plus支持ActiveRecord模式,实体类只需继承Model
类即可进行强大的CRUD操作。不过,需要注意的是,从MyBatis-Plus 3.x版本开始,Model
类已经被废弃,推荐使用BaseEntity
或自定义实体类配合BaseMapper
进行CRUD操作。
相关文章:
MyBatisPlus 用法详解
MyBatisPlus 用法详解 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,包括强大的CRUD操作、条件构造器、自动填充、分页插件等&…...

强化学习入门笔记(Reinforcement Learning,RL) 强推!
由于本人的近期研究方向涉及到强化学习,本科时已经学习过了,但是感觉还是有些概念和算法没有学懂学透,所以想重新系统性的学习一下,记录了整个学习过程,而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…...
C++ QT 工具日志异步分批保存
C QT 工具软件一般可以如此实现日志保存: #define THREAD_ID (reinterpret_cast<qulonglong>(QThread::currentThreadId()) & 0x0FFF) #define TIME (QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss_zzz"))#define LOGD(msg) qD…...
win32com库基于wps对Word文档的基础操作
win32com库基于wps对Word文档的基础操作 文章目录 win32com库基于wps对Word文档的基础操作新建/打开文档段落操作(Paragraph)字体设置(Font)图表操作(Shape) 参考链接: WAS API手册 新建/打开文档 import win32com import win32com.client as win32 # 启动WPS进程 word_obj …...
Kubernetes 网络之深度探索:网络模型与 CNI 插件
Kubernetes 网络之深度探索:网络模型与 CNI 插件 在 Kubernetes 中,网络是一个至关重要的组成部分。它不仅决定了容器之间如何通信,还影响着整个集群的可扩展性和稳定性。本节课将深入剖析 Kubernetes 的网络模型以及 CNI(Container Network Interface)网络插件。 一、K…...
Go 模块管理教程:go.mod 与依赖版本控制
Go 模块管理教程:go.mod 与依赖版本控制 Go 从版本 1.11 开始引入了 Go Modules,通过 go.mod 文件来管理项目的依赖关系和版本。Go 模块系统大大简化了 Go 项目的依赖管理,解决了之前 GOPATH 模式的许多问题。本教程将介绍如何使用 Go 模块管…...
大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL(Extract, Transform, Load)1.2 Flume 概述 2. Flume 环境搭建2.1 下载并安装 Flume2.2 启动 Flume 3. Flume 配置和常见 Source、Sink、Channel3.1 Flume Source3.2 Flume Si…...
鸿蒙next版开发:订阅应用事件(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了强大的应用事件订阅机制,允许开发者订阅和处理系统或应用级别的事件。这一功能对于监控应用行为、优化用户体验和进行性能分析至关重要。本文将详细介绍如何在ArkTS中订阅应用事件,并提供示例代码进行说明。 应…...
F litter 开发之flutter_local_notifications
flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时,默认调用此方法,将实例对象返回出去static NotificationHelper? _instance null;sta…...
springboot参数校验
springboot 参数校验 Validated 以及 Valid - 唏嘘- - 博客园 SpringBoot参数校验Validated、Valid_springboot validate-CSDN博客...

Spring生态学习路径与源码深度探讨
引言 Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学…...

C++:set详解
文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1)find2)count3)lower_bound与upper_bound4)equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同,STL总…...

(一)- DRM架构
一,DRM简介 linux内核中包含两类图形显示设备驱动框架: FB设备:Framebuffer图形显示框架; DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架; 1&am…...

Docker了解
Docker是一种容器化技术,它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中,以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术,可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…...

【DL】YOLO11 OBB目标检测 | 模型训练 | 推理
本文进行YOLO11的旋转目标检测任务,旋转目标检测能够更精确地定位和描述那些非水平排列的目标,比如倾斜的飞机、船舶等。在原始的目标检测中,添加一个角度预测,实现定向边界框检测。 话不多说,先来个效果图!!! YOLO11中的旋转目标检测的特点 ▲更精确的定位:通过使用…...
vue读取本地excel文件并渲染到列表页面
1.安装插件(版本0.18.5) npm i xlsx 2.封装插件 <template><div class"container"><slot></slot></div> </template><script> import * as XLSX from xlsx export default {name: ReadExcel,props: {filePath: {type: …...
github 以及 huggingface下载模型和数据
runningcheese/MirrorSite: 镜像网站合集 (github.com) huggingface 下载模型和数据使用snapshot_download的方法 不会修改HuggingFace模型下载默认缓存路径?一篇教会你!_huggingface默认下载路径-CSDN博客 下载模型 使用snapshot_download 使用snapshot_down…...

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
作者:BLACK595 “小恐龙酷跑”,它是一款有趣的离线游戏,是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标, 但当我们按下空格后,小恐…...

51c视觉~合集6
我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中!CSWin-UNet:U型分割方法,显著提高计算效率和感受野交互!本文提出了CSWin-UNet,这是一种新颖的U型分割方法&…...
STM32(hal库)在串口中,USART和uart有什么区别?
在STM32的HAL库中,USART和UART都是用于串口通信的模块,但它们在功能特性和使用场景上存在一些区别。以下是对两者的详细比较: 一、功能特性 UART(通用异步收发器): 是一种串行、异步、全双工的通信协议。通…...

探索C++标准模板库(STL):String接口的底层实现(下篇)
前引:在C的面向对象编程中,对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据,还是资源管理如何自动化,其底层机制均围绕两个关键概念展开:this指针与六大默认成员函数。它们如同对象的“隐形守护者”&am…...

【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具
博客目录 一、Blackmagic Disk Speed Test 概述二、软件核心功能解析三、v3.3 版本的新特性与改进四、实际应用场景分析五、使用技巧与最佳实践六、与其他工具的比较及优势 一、Blackmagic Disk Speed Test 概述 Blackmagic Disk Speed Test 是 Mac 平台上广受专业人士青睐的一…...
使用Python和Flask构建简单的机器学习API
在机器学习项目中,将模型部署为一个Web API是一种常见的需求。这样可以方便地将模型集成到其他应用程序中,例如移动应用、Web应用或其他后端服务。Flask是一个轻量级的Python Web框架,非常适合用于构建简单的API。本文将通过一个具体的例子&a…...

《影像引导下骨盆创伤手术的术前骨折复位规划:基于学习的综合流程》|文献速递-深度学习医疗AI最新文献
Title 题目 Preoperative fracture reduction planning for image-guided pelvic trauma surgery: A comprehensive pipeline with learning 《影像引导下骨盆创伤手术的术前骨折复位规划:基于学习的综合流程》 01 文献速递介绍 《影像引导下骨盆创伤手术的术前…...

11.RV1126-ROCKX项目 API和人脸检测画框
一.ROCKX的API 1.ROCKX的作用 ROCKX的AI组件可以快速搭建 AI的应用,这些应用可以是车牌识别、人脸识别、目标识别,人体骨骼识别等等。主要用于各种检测识别。例如下图: 2.ROCKX人脸识别的API rockx_ret_t rockx_create(rockx_handle_t *han…...

React - 组件通信
组件通信 概念:组件通信就是组件之间数据传递,根据组件嵌套关系不同,有不同的通信方法 父传子 —— 基础实现 实现步骤 父组件传递数据 - 在子组件标签上绑定属性子组件接收数据 - 子组件通过props参数接收数据 声明子组件并使用 //声明子…...

矩阵QR分解
1 orthonormal 向量与 Orthogonal 矩阵 orthonormal 向量定义为 ,任意向量 相互垂直,且模长为1; 如果将 orthonormal 向量按列组织成矩阵,矩阵为 Orthogonal 矩阵,满足如下性质: ; 当为方阵时&…...

C++学习-入门到精通【14】标准库算法
C学习-入门到精通【14】标准库算法 目录 C学习-入门到精通【14】标准库算法一、对迭代器的最低要求迭代器无效 二、算法1.fill、fill_n、generate和generate_n2.equal、mismatch和lexicographical_compare3.remove、remove_if、remove_copy和remove_copy_if4.replace、replace_…...
使用VTK还是OpenGL集成到qt程序里哪个好?
在Qt程序中集成VTK与OpenGL:选择哪个更好? 在Qt程序中实现三维可视化时,开发者常常面临一个选择:是使用VTK(Visualization Toolkit)还是OpenGL(Open Graphics Library)。这两种技术…...
动手学深度学习12.7. 参数服务器-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:35 分布式训练【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:12.7. 参数服务器…...