MybatisPlus的一些基本操作
mybatisplus分页
@Testvoid testpage(){IPage<User> page =new Page<>(1,3); userDao.selectPage(page,null);System.out.println("当前页码值:"+page.getCurrent());System.out.println("每页显示数:"+page.getSize());System.out.println("一共多少页:"+page.getPages());System.out.println("一共多少条数据:"+page.getTotal());System.out.println("数据:"+page.getRecords());}
DQL编程控制
简化控制台日志输出
# mybatis-plus日志控制台输出 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: banner: off # 关闭mybatisplus启动图标 spring: main: banner-mode: off # 关闭SpringBoot启动图标(banner)
创建Wrapper对象
//1.使用Wrapper对象QueryWrapper wq=new QueryWrapper();wq.lt("age",30);List<User> users = userDao.selectList(wq);System.out.println(users); //2.使用lambda QueryWrapper<User> qw = new QueryWrapper<User>(); qw.lambda().lt(User::getAge, 10);//添加条件 List<User> userList = userDao.selectList(qw); System.out.println(userList); //3.使用LambdaQueryWrapper对象LambdaQueryWrapper<User> wq=new LambdaQueryWrapper<>();wq.lt(User::getAge,30);//支持链式List<User> users = userDao.selectList(wq);System.out.println(users);}
null值处理
//3.null值处理UserQuery uq=new UserQuery();uq.setAge(30);//uq.setAge2(10);LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();lqw.gt(null != uq.getAge2(),User::getAge,uq.getAge2()).lt(uq.getAge()!= null,User::getAge,uq.getAge());List<User> users = userDao.selectList(lqw);System.out.println(users);
查询指定字段(使用LambdaQueryWrapper的select方法)
LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();lambdaQueryWrapper.select(User::getId,User::getName);List<User> users = userDao.selectList(lambdaQueryWrapper);System.out.println(users); //如果不用Lambda,则需要指定字段 QueryWrapper<User> lqw = new QueryWrapper<User>(); lqw.select("id","name","age","tel");
聚合查询
QueryWrapper<User> lqw=new QueryWrapper<>();lqw.select("count(*) as count");List<Map<String, Object>> maps = userDao.selectMaps(lqw);System.out.println(maps);
分组查询(使用QueryWrapper的groupby)方法
QueryWrapper<User> lqw=new QueryWrapper<>();lqw.select("count(*) as count,tel");lqw.groupBy("tel");List<Map<String, Object>> maps = userDao.selectMaps(lqw);System.out.println(maps);
条件构造器
条件构造器 | MyBatis-Plus
eq,like,likeleft,between....
排序查询
orderBy
LambdaQueryWrapper<User> lwq = new LambdaQueryWrapper<>(); /** * condition :条件,返回boolean, 当condition为true,进行排序,如果为false,则不排序 * isAsc:是否为升序,true为升序,false为降序 * columns:需要操作的列 */ lwq.orderBy(true,false, User::getId);
映射匹配问题
-
数据库表名与pojo类名不同
使用@TableName("数据库表名")同步
-
编码中添加了数据库中未定义的属性
使用@TableField(exist = false)
-
采用默认查询开放了更多的字段查看权限(限制敏感数据)
使用@TableField(select = false)
-
字段名与属性名不同
用@TableField(value="字段名")
DML编程控制
id生成策略控制(insert)
AUTO:在字段上注解@TableId(type = IdType.AUTO) NONE: 不设置id生成策略 INPUT:用户手工输入id ASSIGN_ID:雪花算法生成id(可兼容数值型与字符串型) ASSIGN_UUID:以UUID生成算法作为id生成策略 其他的几个策略均已过时,都将被ASSIGN_ID和ASSIGN_UUID代替掉
NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很多判定,实现起来比较复杂 AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用 ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符串,长度过长占用空间而且还不能排序,查询性能也慢 ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键 综上所述,每一种主键策略都有自己的优缺点,根据自己项目业务的实际情况来选择使用才是最明 智的选择。
简化配置
mybatis-plus:global-config:db-config:id-type: assign_idmybatis-plus:global-config:db-config:table-prefix: tbl_
多记录操作(Delete,Select)
使用deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)
逻辑删除(Delete/Update)
物理删除:业务数据从数据库中丢弃,执行的是delete操作
逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中,执行的是update操作
-
数据库表添加 deleted 列,设默认值为0
-
实体类添加属性,注解 @TableLogic(value:逻辑未删除值 delval:逻辑删除值)
-
运行删除方法
-
发现后台执行的update操作
乐观锁(Update)
乐观锁的实现方式: 数据库表中添加version列,比如默认值给1 第一个线程要修改数据之前,取出记录时,获取当前数据库中的version=1 第二个线程要修改数据之前,取出记录时,获取当前数据库中的version=1 第一个线程执行更新时,set version = newVersion where version = oldVersionnewVersion = version+1 [2]oldVersion = version [1] 第二个线程执行更新时,set version = newVersion where version = oldVersionnewVersion = version+1 [2]oldVersion = version [1] 假如这两个线程都来更新数据,第一个和第二个线程都可能先执行假如第一个线程先执行更新,会把version改为2,第二个线程再更新的时候,set version = 2 where version = 1,此时数据库表的数据version已经为2,所以第二个线程会修改失败 假如第二个线程先执行更新,会把version改为2,第一个线程再更新的时候,set version = 2 where version = 1,此时数据库表的数 据version已经为2,所以第一个线程会修改失败不管谁先执行都会确保只能有一个线程更新数据,这就是MP提供的乐观锁的实现原理分析。
具体实现
-
数据库添加列名:使用version ,默认值为1
-
pojo类添加对应的字段名,并且打上@Version注解
-
添加乐观锁的拦截器new OptimisticLockerInnerInterceptor()
-
执行update操作
代码生成器
代码生成器 | MyBatis-Plus
相关文章:
MybatisPlus的一些基本操作
mybatisplus分页 Testvoid testpage(){IPage<User> page new Page<>(1,3); userDao.selectPage(page,null);System.out.println("当前页码值:"page.getCurrent());System.out.println("每页显示数:"page.getSize());S…...
debian12安装mysql5.7.42(deb)
安装 官方文档 https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/linux-installation-debian.html 上面是8.0的教程,服了我说怎么那么奇怪 5.7官方教程 https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-debian.html …...
基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南
基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南 一、背景与价值 在流计算生产环境中,Flink on YARN的部署方式凭借其资源管理优势被广泛采用。Savepoint作为Flink任务状态的一致性快照,承载着故障恢复、版本升级、作业暂停等重要场景…...
Winform入门进阶企业级开发示例:http接口数据清洗转换、断线续传、mqtt数据传输实例详解(附代码资源下载)
场景 C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享_winform 强化学习-CSDN博客 如何将以上相关理论知识学以致用。下面针对Winform…...
PHP开发效率提升利器:通义灵码在VSCode中的应用与技巧
引言 在 PHP 开发领域,提高编码效率和质量是每位开发者追求的目标。通义灵码,作为一款由阿里云技术团队开发的智能编码助手,能够通过其强大的 AI 能力,为 PHP 开发者提供包括代码自动补全、智能注释、代码优化等多方面的支持。本…...
WHAT - React 错误边界处理 - react-error-boundary
目录 安装使用方式常用 Props使用场景 react-error-boundary 是一个由 Brian Vaughn 开发的 React 组件库,用于更方便地处理组件树中的错误(错误边界)。 阅读参考: React Error Boundariesreact-error-boundary 安装 npm inst…...
数据模型评估的四维黄金法则:从技术验证到业务价值证明
引言:为什么你的数据模型总被质疑? 在滴滴出行的一次核心业务会议上,数据团队与业务部门爆发了激烈争论:新上线的订单预测模型是否真的优于旧系统?数据工程师认为查询速度提升40%已是巨大成功,业务方却质疑…...
vscode ctrl+鼠标左键不能跳转
笔者使用的vscode版本是1.85.2(一周前从1.99降下来的,因为版本过高连不上服务器)。 使用python时突然发现代码看起来有些别扭,细看之下发现是import xxx语句中的包的颜色从之前的青色变成了现在的白色。再用ctrl左键点击包名试图…...
换动态IP对电脑有什么影响:全面解析与实用指南
在当今数字化时代,IP地址作为网络世界的"身份证",对我们的网络体验有着重要影响。许多用户出于某些原因,会考虑更换动态IP地址。那么,这种操作究竟会对我们的电脑产生哪些影响?是利大于弊还是弊大于利&#…...
Go语言从零构建SQL数据库(6) - sql解析器(番外)- *号的处理
番外:处理SQL通配符查询 在SQL中,SELECT * FROM table是最基础的查询之一,星号(*)是一个通配符,表示"选择所有列"。虽然通配符查询看起来简单,但在解析器中需要特殊处理。下面详细介…...
大模型推理引擎选型与应用场景分析:SGLang、Ollama、VLLM 和 LLaMA.cpp
在当下的大模型技术生态中,SGLang、Ollama、VLLM 和 LLaMA.cpp 各具特色,适用于不同的应用场景和用户需求。以下是它们的核心特点及适用场景的深度剖析: 1. SGLang:高性能企业级推理引擎 核心优势: 零开销批处理&…...
参考平面跨分割情况下的信号回流
前言:弄清楚信号的回流路径,是学习EMC和高速的第一步! 如果我们不管信号的回流路径,会造成什么后果?1、信号完整性问题,信号的回流路径不连续会导致信号反射、衰减和失真。2、信号衰减和噪声干扰ÿ…...
Vue2下载二进制文件
后端: controller: GetMapping(value "/get-import-template")public void problemTemplate(HttpServletRequest request, HttpServletResponse response) throws Exception {iUserService.problemTemplate(request, response);} service: void probl…...
AnimateCC基础教学:随机抽取花名册,不能重复
一.核心代码: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["张三", &quo…...
windows+cmake+vscode+NDK远程调试安卓端C++项目
windowscmakevscodeNDK远程调试安卓端C项目 windowscmakevscodeNDK远程调试安卓端C项目 windowscmakevscodeNDK远程调试安卓端C项目 使用C开发安卓端算法库时,需要使用NDK进行交叉编译。使用NDK编译代码时,需要编写.mk脚本进行代码的编译和链接…...
大语言模型(LLM)全解析:从原理到实战应用
在人工智能飞速发展的今天,大语言模型(LLM)已成为改变我们工作生活的重要技术。无论是ChatGPT的对话能力,还是DeepSeek的文本处理,背后都离不开LLM的强大支持。本文将用通俗易懂的语言,带您全面了解LLM的工作原理、训练方法、优化…...
Qt 入门 4 之标准对话框
Qt 入门 4 之标准对话框 Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。下面简单讲解这些对话框,可以在帮助索引中查看Standard Dialogs关键字,也可以直接索引相关类的类名。 本文将以一个新的项目为主介绍不…...
PyTorch DataLoader 参数详解
在使用 PyTorch 的 DataLoader 时,有许多参数可以调整,这些参数能够帮助我们平衡数据加载效率、内存使用和训练过程的稳定性。下面介绍几个常用参数,并讲解它们的作用: dataset 含义: 数据集对象,必须实现 …...
PowerBI 计算时间用EDATE
我在原表基础上,根据日期字段,计算去年时间 CONCATENATEX(DISTINCT(SELECTCOLUMNS(VALUES(日期表),"去年", FORMAT(DATEADD([日期], -1, YEAR), "yyyyMM"))), [YearMonth],",") 我发现很奇怪的现象,假如某个日…...
GRBL运动控制算法(四)加减速运算
前言 在数控系统和运动控制领域,GRBL 作为一款高效、轻量化的开源固件,因其卓越的性能和简洁的架构被广泛应用于各类嵌入式运动控制场景。GRBL加减速算法的实现尤为关键——它直接决定了运动控制的精度、效率与设备稳定性。 本文深入解析加减速运算的核…...
CSS 学习提升网站或者项目
有几个不错的开源项目可以帮助你练习和提升CSS技能: CSS-Tricks CSS-Tricks 提供了很多关于CSS的技巧和教程,可以通过实践它们来提高CSS技能。你可以在CSS-Tricks上找到很多有趣的项目和代码示例。 Frontend Mentor Frontend Mentor 是一个非常适合练习…...
PolarDB 读已提交事务隔离级别 select ... for update, where条件未用索引,查不到数据的时候不会锁表
由于没有给字段设置唯一性,所以改为通过查询语句加锁确保唯一性,但是发现select count(*) 为0时,不会加锁,所以在insert方法后面需要加锁二次查询确保唯一性。 在 PolarDB 的读已提交事务隔离级别下,SELECT ... FOR UP…...
Python基础——Matplotlib库
绘图基础 Matplotlib 库太大,画图通常仅仅使用其中的核心模块 matplotlib.pyplot,并给其一个别名 plt,即 import matplotlib.pyplot as plt。为了使图形在展示时能很好的嵌入到 Jupyter 的 Out[ ] 中,需要使用%matplotlib inline…...
群晖Hyper Backup备份的东西怎么还原?
一、背景 前面写了一篇文章关于群晖NAS中最简单的备份方案,Hyper Backup 方案 群晖NAS最简单的备份教程(只备份需要的目录到不同的硬盘),留了个尾,即怎么还原备份的东西,这里完结一下。 二、还原方案 2.…...
记录IBM服务器检测到备份GPT损坏警告排查解决过程
服务器设备:IBM x3550 M4 Server IMM默认IP地址:192.168.70.125 用户名:USERID 密码:PASSW0RD(注意是零0) 操作系统:Windows Hyper-V Server 2016 IMM Web System Status Warning࿱…...
蓝桥杯嵌入式十五届模拟二(串口DMA,占空比的另一种测量方式)
一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹&#…...
22 | 如何继续提升 Go 开发技术?
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战营 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra)。 「Go 项目开发极速…...
一文详解OpenCV环境搭建:Windows使用CLion配置OpenCV开发环境
在计算机视觉和图像处理领域,OpenCV 是一个不可或缺的工具。其为开发者提供了一系列广泛的算法和实用工具,支持多种编程语言,并且可以在多个平台上运行。对于希望在其项目中集成先进视觉功能的开发者来说,掌握如何配置和使用OpenC…...
云原生周刊:深入探索 kube-scheduler-simulator
开源项目推荐 mcp-server-kubernetes mcp-server-kubernetes 是一个实现了模型上下文协议(MCP)的服务器,旨在通过自然语言与 K8s 集群进行交互。它支持连接到 K8s 集群,列出所有 Pod、服务、部署和节点,创建、描述、…...
总结一下常见的EasyExcel面试题
说一下你了解的POI和EasyExcel POI(Poor Obfuscation Implementation):它是 Apache 软件基金会的一个开源项目,为 Java 程序提供了读写 Microsoft Office 格式文件的功能,支持如 Excel、Word、PowerPoint 等多种文件格…...
【Java设计模式】第2章 UML急速入门
2-1 本章导航 UML类图与时序图入门 UML定义 统一建模语言(Unified Modeling Language):第三代非专利建模语言。特点:开放方法,支持可视化构建面向对象系统,涵盖模型、流程、代码等。UML分类(2.2版本) 结构式图形:系统静态建模(类图、对象图、包图)。行为式图形:事…...
Excel处理控件Spire.XLS系列教程:C# 设置 Excel 中的数字格式
在 Excel 工作表中,原始数据通常显示为缺乏直观性的普通数字。通过设置数字格式,可以将这些数字转换成更容易理解的形式。例如,将销售额数据设置为货币格式,即添加货币符号和千位分隔符,可使所代表的金额一目了然。将市…...
脚本启动 Java 程序
如果你想在后台启动一个 Java 程序,并在终端窗口中显示一个自定义的名字,可以通过编写一个简单的脚本来实现。以下是一个基于 Linux/macOS 的解决方案,使用 Bash 脚本启动 Java 程序,并在终端窗口中显示自定义标题。 示例脚本 创建…...
UniappX动态引入在线字体图标,不兼容css时可用。
优缺点 优点:不需要占用本地存储,可直接在线同步库图标,不用再手动引入ttf文件,不用手动添加键值对对应表。 缺点:受网速影响,字体库cdn路径可能会更改,ios端首次加载,可能会无图标…...
机器学习 | 强化学习基本原理 | MDP | TD | PG | TRPO
文章目录 📚什么是强化学习🐇监督学习 vs 强化学习🐇马尔科夫决策过程(MDP)📚基本算法(value-based & policy-based)🐇时序差分算法(TD)🐇SARSA和Q-learning🐇策略梯度算法(PG)🐇REINFORCE和Actor-Critic🐇信任区域策略优化算法(TRPO)学习视频…...
k8s之Service类型详解
1.ClusterIP 类型 2.NodePort 类型 3.LoadBalancer 类型 4.ExternalName 类型 类型为 ExternalName 的 Service 将 Service 映射到 DNS 名称,而不是典型的选择算符, 例如 my-service 或者 cassandra。你可以使用 spec.externalName 参数指定这些服务…...
AI平台如何实现推理?数算岛是一个开源的AI平台(主要用于管理和调度分布式AI训练和推理任务。)
数算岛是一个开源的AI平台,主要用于管理和调度分布式AI训练和推理任务。它基于Kubernetes构建,支持多种深度学习框架(如TensorFlow、PyTorch等)。以下是数算岛实现模型推理的核心原理、架构及具体实现步骤: 一、数算岛…...
linux开发环境
1.虚拟机环境搭建 在 Ubuntu 系统中,打开(如图中显示的窗口 )常见快捷键有: Ctrl Alt T:这是最常用的打开终端的快捷键组合 ,按下后会快速弹出一个新的终端窗口。 在 VMware 虚拟机环境中,若…...
OSPF复习
OSPF OSPF---开放最短路径优先协议 动态路由判定依据:选路,收敛速度,占用资源 OSPFV2和RIPV2的相同点: 1.都是无类别的路由协议; 2.都是通过组播来传播信息的;(RIP:224.0.0.9&am…...
AWS S3深度剖析:云存储的瑞士军刀
1. 引言 在当今数据驱动的世界中,高效、可靠、安全的数据存储解决方案至关重要。Amazon Simple Storage Service (S3)作为AWS生态系统中的核心服务之一,为企业和开发者提供了一个强大而灵活的对象存储平台。本文将全面解析S3的核心特性,帮助读者深入理解如何充分利用这一&q…...
pyTorch中 tensorboard的使用
目录 01.导包、 transforms数据转化、torchvision数据集、创建dataloaders、展示图片的封装函数 02定义模型 03定义损失函数与优化器 1.tensorboard的安装 2.tensorboard的使用 2.1添加图片 2.2 添加模型结构图 2.3 添加损失的变化 #pyTorch中的tensorboard 与 tens…...
Android audio(2)-audioservice
AudioService是Android的系统服务(systemservice),由SystemServer负责启动。提供Android APK 所需的非数据通路(playback/capture)相关的audio 功能实现,是binder通信中的server端,与之对应的 C…...
星城幻境:科技与千年文脉的交响诗-长沙
故事背景 故事发生在中国湖南长沙,通过六个充满未来感的城市景观,展现人工智能修复古建筑、生态摩天楼、全息水幕许愿等场景,描绘科技赋能下历史文脉与未来城市的共生图景。 故事内容 从岳麓书院清晨的智能修复到湘江夜空的数字烟花ÿ…...
记录学习的第二十三天
老样子,每日一题开胃。 我一开始还想着暴力解一下试试呢,结果不太行😂 接着两道动态规划。 这道题我本来是想用最长递增子序列来做的,不过实在是太麻烦了,实在做不下去了。 然后看了题解,发现可以倒着数。 …...
sql-labs靶场 less-1
文章目录 sqli-labs靶场less 1 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
AI-人工智能-基于LC-MS/MS分子网络深度分析的天然产物成分解析的新策略
Anal Chem∣张卫东教授团队开发基于LC-MS/MS分子网络深度分析的天然产物成分解析的新策略 2024年9月23日,海军军医大学张卫东教授团队在Analytical Chemistry(IF6.7)上发表了题为“In-Depth Analysis of Molecular Network Based on Liquid …...
IntelliJ IDEA使用技巧(json字符串格式化)
文章目录 一、IDEA自动格式化json字符串二、配置/查找格式化快捷键 本文主要讲述idea中怎么将json字符串转换为JSON格式的内容并且有层级结构。 效果: 转换前: 转换后: 一、IDEA自动格式化json字符串 步骤一:首先创建一个临…...
【Java设计模式】第8章 单列模式讲解
8-1 单例模式讲解 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点。类型:创建型模式。适用场景 需要确保任何情况下绝对只有一个实例。实际应用: 网站计数器(单服务)。应用配置、线程池、数据库连接池。优点 减少内存开销(仅一个实例)。避免资源多重占…...
【Java设计模式】第4章 简单工厂讲解
4. 简单工厂模式 4.1 简单工厂讲解 定义:由一个工厂对象决定创建哪种产品类的实例,属于创建型模式,但不属于GoF 23种设计模式。适用场景: 工厂类负责创建的对象较少。客户端仅需传入参数,无需关心对象创建逻辑。优点: 客户端只需传入参数即可获取对象,无需知道创建细节…...
Spring Boot 常用依赖介绍
依赖总括 1. 核心依赖:Spring Web、Spring Data JPA、MySQL Driver。 2. 开发工具:Lombok、Spring Boot DevTools。 3. 安全与权限:Spring Security。 4. 测试与文档:Spring Boot Starter Test、Swagger。 5. 性能优化&#…...