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

MybatisPlus框架入门级理解

MybatisPlus

    • 快速入门
      • 入门案例
      • 常见注解
      • 常用配置
    • 核心功能
      • 条件构造器
      • 自定义SQL
      • Service接口

快速入门

入门案例

使用MybatisPlus的基本步骤:
1.引入MybatisPlus的起步依赖
MybatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。因此,可以使用MybatisPlus的starter代替Mybatis的starter。
pom.xml

<!--mybatisplus依赖-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>

2.自定义的Mapper继承MybatisPlus提供的BaseMapper接口

public interface UserMapper extends BaseMapper<User> {
}

在这里插入图片描述
3.在实体类上添加注解声明表信息
4.在application.yml中根据需要添加配置

注:如果application.yml没有显示绿叶,可以按照以下步骤进行添加:
File --> Project Structure --> Facets --> “+” Spring --> 右上角小绿叶 Customize Spring Boot --> 将项目中的application.yml添加进去即可

常见注解

MybatisPlus是如何获取实现CRUD的数据库信息的?

  • 默认以类名驼峰转下划线作为表名
  • 默认把名为id的字段作为主键
  • 默认把变量名驼峰转下划线作为表的字段名

MybatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
MybatisPlus中比较常用的几个注解如下:

  • @TableName:用来指定表名

  • @TableId:用来指定表中的主键字段信息
    IdType枚举:
    AUTO:数据库自增长
    INPUT:通过set方法自行输入
    ASSIGN_ID:分配ID,接口IdentifierGenerator的方法nextId来生成id

  • @TableField:用来指定表中的普通字段信息
    使用场景:
    ①成员变量名与数据库字段名不一致
    ②成员变量名以is开头,且是布尔值
    ③成员变量名与数据库关键字冲突,如“order”,在@TableField中要用转义字符括起来
    ⑩成员变量不是数据库字段,@TableField(exist = false)

常用配置

MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。
application.yml

mybatis-plus:type-aliases-package: com.wmy.mp.domain.po  # 别名扫描包mapper-locations: "classpath*:/mapper/**/*.xml"  # Mapper.xml文件地址 默认值configuration:map-underscore-to-camel-case: true  # 是否开启下划线和驼峰的映射cache-enabled: false  # 是否开启二级缓存global-config:  # 全局配置 优先级低于局部的配置db-config:id-type: assign_id  # id为雪花算法生成update-strategy: not_null  # 更新策略:只更新非空字段

MybatisPlus官方文档

核心功能

条件构造器

MybatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。在MybatisPlus中BaseMapper接口是用来提供增删改查功能的,其中一些比较特殊的方法的参数都不再是简单的id,而是一个Wrapper类型的参数,所谓的Wrapper就是条件构造器,用以构造复杂的sql语句。Wrapper并不是一个简单的类,而是类似于Collection,具备一个复杂的继承体系。
在这里插入图片描述
比如说:
QueryWrapper就是在父类基础上拓展了select相关的功能,允许构造SQL语句时能指定select哪些字段;
UpdateWrapper就是在父类基础上拓展了set相关的功能,它的setSql(boolean , String ) : UpdateWrapper<T>方法允许将set部分的字符串当做参数传递进去,后边可以拼接到SQL语句中。
基于QueryWrapper的查询案例
需求
①查询出名字中带"o"的,存款大于等于1000元的人的id、username、info、balance字段。
SQL语句

SELECT id,username,info,balance
FROM user
WHERE username LIKE ? AND balance >= ?

QueryWrapper查询:UserMapperTest.java

@Test
void testQueryWrapper(){//1.构件查询条件QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id", "username", "info", "balance").like("username", "o").ge("balance", 1000);//2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);
}//或者
@Test
void testLambdaQueryWrapper(){//1.构件查询条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().select(User::getId, User::getUsername, User::getInfo, User::getBalance).like(User::getUsername, "o").ge(User::getBalance, 1000);//2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);
}

加粗样式
②更新用户名为jack的用户的余额为2000。
SQL语句

UPDATE userSET balance = 2000WHERE (username = "jack")

QueryWrapper查询

@Test
void testUpdateByQueryWrapper() {//1.要更新的数据User user = new User();user.setBalance(2000);//2.更新的条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");//3.执行更新userMapper.update(user, wrapper);
}

基于UpdateWrapper的更新案例
需求
更新id为1,2,4的用户的余额,扣200
SQL语句

UPDATE userSET balance = balance - 200WHERE id in (1, 2, 4)

UpdateWrapper查询:UserMapperTest.java

@Test
void testUpdateWrapper(){List<Long> ids = List.of(1L ,2L ,4L);UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id" , ids);userMapper.update(null , wrapper);
}

小结

  • QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
  • UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
  • 尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

自定义SQL

从条件构造器的学习中可以看出,虽然MybatisPlus提供了非常灵活的关于Where条件的SQL语句拼接方式,但是它是在业务逻辑层完成的,违背了企业开发的一些规范,如果不使用的话自己在xml文件中编写完整的SQL语句又会很麻烦。因此,我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自定义SQL语句中剩下的部分。我们需要想一种办法把mp构建好的条件往下传递给mapper层,在xml中最终实现SQL语句的组装。
步骤
1.基于Wrapper构建where条件
UserMapperTest.java

@Test
void testCustomSqlUpdate() {//1.更新条件List<Long> ids = List.of(1L , 2L , 4l);int amount = 200;//2.定义条件QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id" , ids);//3.调用自定义SQL方法userMapper.updateBalanceByIds(wrapper, amount);
}

2.在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
UserMapper.java

void updateBalanceByIds(@Param("ew") QueryWrapper<User> wrapper, @Param("amount") int amount);

3.自定义SQL,并使用Wrapper条件
UserMapper.xml

<update id="updateBalanceByIds">UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>

Service接口

Service接口类似于BaseMapper接口,包含了一些基本的增删改查的代码,跟BaseMapper相比,只多不少。
基本用法
在这里插入图片描述
自定义接口需要实现IService接口,自定义实现类需要继承IService的实现类ServiceImpl
IUserService.java

public interface IUserService extends IService<User>{
}

UserServiceImpl.java

@Service
public class UserServiceImpl extends IServiceImpl<UserMapper, User> implements IUserService {
}

批量新增
IUserServiceTest.java

//方式一:普通for循环插入 提交了100000次网络请求
@Test
void testSaveOneByOne(){long b = System.currentTimeMillis();for(int i = 1; i <= 100000 ; i++ ){userService.save(builderUser(i));}long e = System.currentTimeMillis();System.out.println("耗时:" + (e - b));
}//方式二:IService的批量插入 每次批量插入1000条数据 插入100次即10万条数据
@Test
void testSaveBatch(){//1.准备一个容量为1000的集合List<User> list = new ArrayList<>(1000);long b = System.currentTimeMillis();for (int i = 1; i <= 100000 ; i++){//2.添加一个userlist.add(buildUser(i));//3.每1000条批量插入一次if (i % 1000 == 0){userService.saveBatch(list);//4.清空集合 准备下一批数据list.clear();	}}
}

方式二相较于方式一,采用的是批处理的方式,速度快了近十倍,方拾贰需要向网络请求100次,但是由于在预编译的过程中,每次的1000条数据是被编译成了1000条SQL语句,所以MySQL在执行的过程中就是逐条执行的,所以方式二仍然有改进空间,可以通过配置jdbc参数,在application.yaml的url后面拼接上一个参数rewriteBatchedStatements=true,开启该参数之后,相当于把100000条插入语句变成了一个包含了100000条插入值的语句,只需要执行一次,速度上会快很多,这才是真正意义上的批处理。

相关文章:

MybatisPlus框架入门级理解

MybatisPlus 快速入门入门案例常见注解常用配置 核心功能条件构造器自定义SQLService接口 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a; 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供了starter&#xff0c;其中集成了Mybatis和MybatisPlus的所有功能&#…...

ELK 分离式日志(1)

目录 一.ELK组件 ElasticSearch&#xff1a; Kiabana&#xff1a; Logstash&#xff1a; 可以添加的其它组件&#xff1a; ELK 的工作原理&#xff1a; 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件&#xff1a; 修改elasticsearch主配置文件&…...

<蓝桥杯软件赛>零基础备赛20周--第15周--快速幂+素数

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…...

Opencv小项目——手势数字刷TIKTOK

​ 写在前面&#xff1a; 很久没更新了&#xff0c;之前的实习的记录也算是烂尾了&#xff0c;但是好在自己的实习记录还是有的&#xff0c;最近也忙碌了很多&#xff0c;终于放假了&#xff0c;今天下午正好没事&#xff0c;闲来无事就随便做个小玩意吧。 思来想去&#xff…...

【优化技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

针对Java对象压缩及序列化技术的探索之路 序列化和反序列化为何需要有序列化呢&#xff1f;Java实现序列化的方式二进制格式 指定语言层级二进制格式 跨语言层级JSON 格式化类JSON格式化&#xff1a;XML文件格式化 序列化的分类在速度的对比上一般有如下规律&#xff1a;Java…...

Spring+SprinMVC+MyBatis配置方式简易模板

SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…...

Windows ssh登录eNSP交换机

目录 1. Cloud IO配置1.1 创建UDP端口1.2 创建本地连接1.3 端口映射设置 2. 交换机配置2.1 配置vlanif2.2 配置vty2.3 配置ssh用户2.4 配置aaa2.5 使用Xshell工具登录2.6 用户和密码2.7 登录成功 3. 使用cmd 登录报错提示3.1 手动指定加密算法&#xff0c;提示密码长度无效3.2 …...

SwiftUI 纯手工打造 100% 可定制的导航栏

功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…...

npm install 太慢?解决方法

在使用npm进行包管理时&#xff0c;有时会遇到安装速度缓慢的问题。这可能是由于网络原因或npm官方镜像服务器的繁忙导致的。下面介绍几种常见的解决方法&#xff1a; 使用淘宝镜像 淘宝镜像是一个提供npm包镜像的国内源&#xff0c;其速度较快且稳定。您可以通过以下命令将npm…...

DevOps系列文章之 GitLab CI/CD

CICD是什么? 由于目前公司使用的gitlab&#xff0c;大部分项目使用的CICD是gitlab的CICD&#xff0c;少部分用的是jenkins&#xff0c;使用了gitlab-ci一段时间后感觉还不错&#xff0c;因此总结一下 介绍gitlab的CICD之前&#xff0c;可以先了解CICD是什么 我们的开发模式…...

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)

需求&#xff1a; 1.我们希望玩家的业务在玩家线程执行&#xff0c;无需回调&#xff0c;因此是多线程处理。 2.匹配线程负责匹配逻辑&#xff0c;是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后&#xff0c;需要给玩家发奖修改玩家数…...

什么是浏览器指纹?详解浏览器指纹识别技术,教你防止浏览器指纹识别

在数字时代&#xff0c;我们的在线活动几乎总是留下痕迹。其中&#xff0c;浏览器指纹就像我们的数字身份证&#xff0c;让网站能够识别和追踪用户。对于跨境电商行业来说&#xff0c;了解这种追踪技术尤其重要&#xff0c;因为它可能影响账号的管理和安全。本文将详细介绍浏览…...

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…...

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…...

gitgud.io+Sapphire注册账号教程

gitgud.io是一个仓库&#xff0c;地址 https://gitgud.io/&#xff0c;点进去之后会看到注册页面。 意思是需要通过注册这个Sapphire账户来登录。点击右边的Sapphire&#xff0c;就跳转到Sapphire的登陆页面&#xff0c;点击创建新账号&#xff0c;就进入注册页面。&#xff0…...

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…...

python基础小知识:引用和赋值的区别

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1.引用 python中&#xff0c;赋值操作会产生相同对象的多个引用&#xff0c; 如果在原位置修改这个可变对象时&#xff0c;可能会影响程序其他位置对这个对象的…...

欧科云链与《警察技术》联合发布技术专题.pdf

欧科云链受《警察技术》邀请&#xff0c;于第201期期刊正式刊登“区块链生态安全与虚拟货币犯罪治理”技术专题。欧科云链作为该技术专题主要作者&#xff0c;直接参与本次期刊2篇文章撰写&#xff0c;同时为多篇文章提供欧科云链的最新数据和研究成果。 《警察技术》期刊创办于…...

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、sqlite3介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&…...

websocket实现聊天室(vue2 + node)

通过websocket实现简单的聊天室功能 需求分析如图&#xff1a; 搭建的项目结构如图&#xff1a; 前端步骤&#xff1a; vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码&#xff1a; Login…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...