MyBatis-Plus特性及插件整合
了解MyBatis-Plus
什么是MyBatis-Plus?
mybatisPlus在mybatis的基础上继续针对CRUD操作进行优化,在原有的基础上提供了公共的接口BaseMapper,我们在创建接口Mapper时只需要继承这个接口即可调用MyBatisPlus已经提供好的方法,sql和方法都是已经被MyBatisPlus内置的
并且MyBatisPlus在MyBatis的基础上又扩展了更加强大的功能,比如内置了分页插件、代码自动生成等等极大的优化了开发效率
体验MyBatisPlus
1、创建SpringBoot项目
2、编写实体类以及其对应接口并继承BaseMapper,将编写好的实体类填充至泛型,接口中不需要声明任何方法。只需要按照正常的开发顺序添加@Repository或者@Mapper保证将其托管给Spring容器即可
@Repository
public interface UserMapper extends BaseMapper<User> { }
3、在主程序上方开启接口扫描,保证我们定义好的接口可以被识别生效
@MapperScan("com.yuqu.mapper")
@SpringBootApplication
4、开始测试
@Test
public void test01(){List<User> list = userMapper.selectList(null);list.forEach(System.out::println);
}
主键生成策略
我们先来执行一次插入操作,只指定除ID以外的其他字段
int i = userMapper.insert(new User("张三", 25, "yuqu1028@163.com"));
// 默认添加id:1630488694524837889
System.out.println("影响行数"+i);
最终添加成功,但是ID是由mybatisPlus帮助生成的,但是我们可以通过在实体类的ID属性上添加@TableID注解来指定id生成的策略。
@TableId()
private Long id;// 将@TableId注解放在id字段上
可以为其设置参数@TableId(type = IdType.AUTO)
表示自增,但是要保证数据库也设置了该字段为自增字段
以及ASSIGN_ID表示当插入对象ID为空时,才会自动填充。默认再用雪花算法实现
ASSIGN_UUID 表示为其分配UUID:UUID.replace(“-”,“”)
INPUT表示由手动插入ID,NONE表示表中没有主键
自动填充
第一种方式是可以在数据库层面进行操作,设置创建时间和更新时间。
第二种就是mybatis-plus提供的注解,在需要更新和自动填充的字段上进行修饰
// 设置创建实际按自动填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 设置更新实际按填充并且自动更新
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
标记上注解之后去自定义处理器,自定义一个类实现mybatisPlus提供的一个数据接口MetaObjectHandler,并且重写两个方法insertFill和updateFill
@Slf4j
@Component
public class MyHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill....");this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill....");this.setFieldValByName("updateTime",new Date(),metaObject);}
}
乐观锁机制
给数据库添加version字段,在访问对某一条数据进行操作时会先获取到它的version。获取到之后进行需要进行的操作然后设置version+1,在刷新数据的时候进行判断如果version==1那就说明这段时间没有别的线程并发操作了该数据,即数据是安全的,就可以提交数据
依然是将@Version注解修饰在对应属性上,表示这是一个乐观锁
@Version // 乐观锁注解
private int version;
配置mybatisPlus乐观锁插件
// 配置version乐观锁插件 拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;
}
分页查询
mybatisPlus内置了分页插件,与乐观锁一样需要在mybatisPlus配置类中配置并注入bean即可使用
// 分页插件
@Bean
public PaginationInnerInterceptor paginationInnerInterceptor(){return new PaginationInnerInterceptor();
}
测试分页
@Test
public void test05(){// param1:页码 param2:页面数据条数Page<User> page = new Page<>(1,3);// 查询总数System.out.println(page.getTotal());userMapper.selectPage(page,null);// 根据page查询指定数目数据page.getRecords().forEach(System.out::println);
}
逻辑删除
表示并不是真正的将数据从数据库中删除,而是让其失效。比如手机中删除照片的最近删除,要删除这些已经“删除”的数据再进行一次深度删除即可,使用时只需要在数据库表中定义一个字段,并在实体类对应字段上用注解标注字段即可
@TableLogic // 逻辑删除注解
private Integer deleted;
测试删除:user.deleteById(6);最终执行成功并不是将该数据真正删除,而是将修改该数据的deleted字段为1,该字段为0表示未删除。也可以在springBoot的yaml配置文件中进行修改,自定义的值将会覆盖默认值
mybatis-plus:global-config:db-config:# 逻辑删除字段名logic-delete-field: deleted# 未删除标识logic-not-delete-value: 0# 已删除标识logic-delete-value: 1
执行SQL分析打印
可以格式化执行的sql,更加直观的看到sql语句。以及打印执行用时,常用于测试找到慢查询。但是缺点mybatis官方也指出了: 该插件有性能损耗,不建议生产环境使用
导入p6spy打印SQL依赖
<!-- 执行sql分析打印 -->
<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version>
</dependency>
在resource目录下创建spy.properties配置文件然后就可以直接使用
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
条件构造器Wrapper
建议参考MyBatis-Plus官网:
https://baomidou.com/pages/10c804/
相关文章:
MyBatis-Plus特性及插件整合
了解MyBatis-Plus 什么是MyBatis-Plus? mybatisPlus在mybatis的基础上继续针对CRUD操作进行优化,在原有的基础上提供了公共的接口BaseMapper,我们在创建接口Mapper时只需要继承这个接口即可调用MyBatisPlus已经提供好的方法,sql…...

应用篇|网络安全知识培训考试,答题小程序操作指引
网络安全知识培训考试,答题小程序操作指引关于全民防诈反诈宣传或者网络安全知识学习,如何进行组织一场微信线上答题考试?可以在小程序“护网专题信息安全知识竞答”,先创建一个学习单位/小组,再邀请成员加入单位/小组…...

官方不推荐@Autowired
1用lombok注解 2 构造器...

【牛客刷题专栏】0x0E:JZ6 从尾到头打印链表(C语言编程题)
前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录前言问题…...

Zeppelin安装
1、下载Zeppelin 下载地址:Download 2.解压 [rootguo147 install]# tar -zxvf zeppelin-0.10.0-bin-all.tgz -C ../soft/ //修改文件名 [rootguo147 soft]# mv zeppelin-0.10.0-bin-all/ zeppelin 3.配置 //进入conf 目录 [rootguo147 conf]# pwd /opt/soft/zepp…...

【蓝桥杯选拔赛真题38】python目标值判断 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
目录 python目标值判断 一、题目要求 1、编程实现 2、输入输出 二、解题思路...

Python jieba分词如何添加自定义词和去除不需要长尾词
Python jieba分词如何添加自定义词和去除不需要长尾词 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 通过如下代码,读取一个txt的高频词汇: # 找到高频词汇t…...

云打包苹果证书生成、上架和应用截屏攻略
在使用apicloud或hbuilderx这些跨端的开发工具开发移动应用的时候,假如是打包ios应用,是需要生成苹果证书、证书profile文件,和对应用上架的。首先要普及一个概念,苹果的应用是无法像安卓那样挂在自己的服务器上下载直接安装就可以…...

洛谷 U91193:棋盘覆盖问题 ← 分治法
【题目来源】https://www.luogu.com.cn/problem/U91193【问题描述】 在一个2^k * 2^k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格。现在用4种不同形状的 L型(占3小格)骨牌覆…...

基于OMAPL138+FPGA核心板多核软件开发组件MCSDK开发入门(下)
本文测试板卡为创龙科技 SOM-TL138F 是一款基于 TI OMAP-L138(定点/浮点 DSP C674x + ARM9)+ 紫光同创 Logos/Xilinx Spartan-6 低功耗 FPGA 处理器设计的工业级核心板。核心板内部OMAP-L138 与 Logos/Spartan-6 通过 uPP、EMIFA、I2C 通信总线连接,并通过工业级 B2B连接器引…...

熵,线性规划,半监督自监督聚类打标签
1.熵 信息熵是消除不确定性所需信息量的度量。 信息熵就是信息的不确定程度,信息熵越小,信息越确定。 对象的信息熵是正比于它的概率的负对数的,也就是 I©−log(pc) 其中n为事件的所有可能性。 为什么使用交叉熵?在机器学习…...

求极限方法总结
1.利用四则运算法则求极限 2.利用两个重要极限求极限 //0除以0型 //1的无穷次方型 3.利用等价无穷小替换替换求极限 //在等价替换时注意和差项 4.利用洛必达法则求极限 5.利用夹逼准则求极限 6.利用单调有界数列极限准则求极限 7.利用无穷小的性质求极限 8.利用函数的连续性…...

Flutter Scrollable 中ViewPort滚动原理
关于Flutter Sliver组件内容可以参考下面这位博主博客,写的已经非常好了,这里就不再赘述。 38、Flutter之 可滚动组件简介_flutter 可滑动_风雨「83」的博客-CSDN博客 通过阅读上面的博客,我们已经知道了Scrollable和Viewport基础概念&#…...
多目标粒子群结合极限学习机ELM求解帕累托前沿,MOPSO-ELM
目录 背影 parte前沿的定义 注意事项 基于多目标粒子群结合极限学习机的帕累托前沿求解帕累托前沿 主要参数 MATLAB代码 效果图 结果分析 展望 背影 在目标优化过程种,很多时候都两个或者多个目标,并且目标函数不能同时达到最优,鱼与熊掌不可兼得,这个时候可以通过求解帕…...

(二十)操作系统-信号量机制
文章目录一、知识预览二、前篇文章知识点回顾三、信号量机制四、信号量机制—整形信号量五、信号量机制—记录型信号量六、总结一、知识预览 二、前篇文章知识点回顾 进程互斥的四种软件实现方式:单标志法、双标志先检查、双标志后检查、Peterson算法。(…...
ceph osd slow ops 检测
目的 常用的方法检测 ceph slow 问题 参考 yceph -scluster:id: 22908555-e596-4c2d-a1f6-34fcf4d3e935health: HEALTH_WARNDegraded data redundancy: 46384/12805029 objects degraded (0.362%), 145 pgs degraded, 122 pgs undersized309 slow ops, oldest one blocked…...

百度CTO王海峰:深度学习平台+大模型,夯实产业智能化基座
2月27日,中国人工智能学会首届智能融合产业论坛在成都顺利举办。本届论坛由中国人工智能学会(CAAI)主办,中国人工智能学会智能融合专委会、百度公司、深度学习技术及应用国家工程研究中心和电子科技大学联合承办。中国工程院多名院…...

【C++】vector的基本使用
难道向上攀爬的那条路,不是比站在顶峰更让人热血沸腾吗? 文章目录一、vector和string的联系与不同二、vector的扩容操作1.resize() (缺省值为匿名对象)&& reserve()2.reserve在g和vs上的扩容机制3.reserve异地扩容和shri…...

社交媒体营销的5个好处
有些人认为,社交媒体营销不能直接与销售挂钩。这就是为什么在制定营销策略时,社交媒体营销会被部分人忽视的原因。然而,与其他广告渠道不同,社交媒体是双向渠道。忽视社交媒体营销将影响与客户的关系。最重要的是,它将…...

飞行机器人专栏(十)-- 异构多视角视觉系统
感知系统架构为满足天空端主控制器的诸如RGB-D图像处理等大容量数据吞吐、高速并行计算、实时运动控制以及通信和可视化任务的计算算力需求,同时优化功耗表现,采用了结构紧凑、功耗表现优异的边缘计算硬件NVIDA IJetson AGXOrin 。该开发者套件包含高性能…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...