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

MyBatisPlus 用法详解

MyBatisPlus 用法详解

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,包括强大的CRUD操作、条件构造器、自动填充、分页插件等,极大地简化了开发工作。以下是对MyBatis-Plus的详细用法介绍。

一、MyBatis-Plus简介

MyBatis-Plus的官网地址为:https://mybatis.plus/ 或 https://mp.baomidou.com/。

MyBatis-Plus的主要特性包括:

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。
  2. 损耗小:启动即会自动注入基本CRUD,性能基本无损耗,直接面向对象操作。
  3. 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
  4. 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件,无需再担心字段写错。
  5. 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-Sequence),可自由配置,完美解决主键问题。
  6. 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。
  7. 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
  8. 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置。
  9. 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
  10. 内置性能分析插件:可输出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.ymlapplication.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,其子类包括QueryWrapperUpdateWrapper

1. 基本比较操作

使用eqnegtgeltle等方法进行基本比较操作。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三"); // 等价于 WHERE name = '张三'
queryWrapper.ne("age", 18); // 等价于 WHERE age <> 18
2. 模糊查询

使用likenotLikelikeLeftlikeRight等方法进行模糊查询。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张"); // 等价于 WHERE name LIKE '%张%'
3. 排序

使用orderByAscorderByDesc等方法进行排序。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("age"); // 等价于 ORDER BY age ASC
4. 逻辑查询

使用andornested等方法进行逻辑查询。例如:

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&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。它提供了丰富的功能&#xff0c;包括强大的CRUD操作、条件构造器、自动填充、分页插件等&…...

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…...

C++ QT 工具日志异步分批保存

C QT 工具软件一般可以如此实现日志保存&#xff1a; #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 模块管理教程&#xff1a;go.mod 与依赖版本控制 Go 从版本 1.11 开始引入了 Go Modules&#xff0c;通过 go.mod 文件来管理项目的依赖关系和版本。Go 模块系统大大简化了 Go 项目的依赖管理&#xff0c;解决了之前 GOPATH 模式的许多问题。本教程将介绍如何使用 Go 模块管…...

大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)

大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL&#xff08;Extract, Transform, Load&#xff09;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中&#xff0c;ArkTS提供了强大的应用事件订阅机制&#xff0c;允许开发者订阅和处理系统或应用级别的事件。这一功能对于监控应用行为、优化用户体验和进行性能分析至关重要。本文将详细介绍如何在ArkTS中订阅应用事件&#xff0c;并提供示例代码进行说明。 应…...

F litter 开发之flutter_local_notifications

flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时&#xff0c;默认调用此方法&#xff0c;将实例对象返回出去static NotificationHelper? _instance null;sta…...

springboot参数校验

springboot 参数校验 Validated 以及 Valid - 唏嘘- - 博客园 SpringBoot参数校验Validated、Valid_springboot validate-CSDN博客...

Spring生态学习路径与源码深度探讨

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

C++:set详解

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

(一)- DRM架构

一&#xff0c;DRM简介 linux内核中包含两类图形显示设备驱动框架&#xff1a; FB设备&#xff1a;Framebuffer图形显示框架; DRM&#xff1a;直接渲染管理器&#xff08;Direct Rendering Manager&#xff09;&#xff0c;是linux目前主流的图形显示框架&#xff1b; 1&am…...

Docker了解

Docker是一种容器化技术&#xff0c;它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中&#xff0c;以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术&#xff0c;可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 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模型下载默认缓存路径&#xff1f;一篇教会你!_huggingface默认下载路径-CSDN博客 下载模型 使用snapshot_download 使用snapshot_down…...

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏

作者&#xff1a;BLACK595 “小恐龙酷跑”&#xff0c;它是一款有趣的离线游戏&#xff0c;是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标&#xff0c; 但当我们按下空格后&#xff0c;小恐…...

51c视觉~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中&#xff01;CSWin-UNet&#xff1a;U型分割方法&#xff0c;显著提高计算效率和感受野交互&#xff01;本文提出了CSWin-UNet&#xff0c;这是一种新颖的U型分割方法&…...

STM32(hal库)在串口中,USART和uart有什么区别?

在STM32的HAL库中&#xff0c;USART和UART都是用于串口通信的模块&#xff0c;但它们在功能特性和使用场景上存在一些区别。以下是对两者的详细比较&#xff1a; 一、功能特性 UART&#xff08;通用异步收发器&#xff09;&#xff1a; 是一种串行、异步、全双工的通信协议。通…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...