MyBatisPlus4-DML编程控制(增删改)、id生成策略、逻辑删除、乐观锁和悲观锁

news2024/11/30 13:45:09

1. id生成策略控制(增)

在这里插入图片描述

名称: @TableId
类型: 属性注解
位置: 模型类中用于表示主键的属性定义上方
作用: 设置当前类中主键属性的生成策略

public class User {
	@TableId(type = IdType.AUTO)
	private Long id;
}

value: 设置数据库主键名称
type: 设置主键属性的生成策略,值参照IdType枚举值

type = IdType.AUTO 表示自增生成id

type = IdType.INPUT 需要自己写入id

type = IdType.ASSIGN_ID 生成式id(雪花算法生成),可兼容数值型与字符串型

在这里插入图片描述
雪花算法生成的ID是一个64位整数,其中包含了以下信息:

  • 1位标志位:固定为0,表示这是一个正整数;
  • 41位的时间戳:精度为毫秒,可以使用69年;
  • 10位的工作机器ID:用来标识数据中心和机器,最多可以使用1024台机器;
  • 12位的序列号:每台机器每毫秒可以生成最多4096个ID。

这样,即使在分布式系统中生成ID,也可以保证ID的全局唯一性和有序性,而且也可以根据ID的组成部分推断出ID的生成时间和所在机器的信息。
雪花算法实现简单,不需要任何分布式锁支持,在高并发场景下生成ID性能优异,被广泛应用于分布式系统中的数据标识和生成。

type = IdType.ASSIGN_UUID 以UUID生成算法作为id生成策略

为了避免在每个实体类中都写生成id策略,可以直接配置文件中全局设定

# mp日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    # 让应用程序在启动时不打印Spring Banner,从而简化控制台输出信息,减少不必要的干扰
    # Spring Banner 是启动程序时打印在控制台上的 ASCII 艺术图
    banner: false
    db-config:
     	# id生成策略全局配置
 		id-type: assign_id
 		# 表名前缀全局配置,这样就不用再实体类中配置@TableName()属性了,直接实现表名与实体类名的自动映射
 		table-prefix: tbl_

2. 多记录操作(删)

2.1 根据id值批量删除

    @Test
    void testDelete(){
        //删除指定多条数据
        List<Long> list = new ArrayList<>();
        list.add(1402551342481838081L);
        list.add(1402553134049501186L);
        list.add(1402553619611430913L);
        userDao.deleteBatchIds(list);
        
        //也支持查询指定多条数据
//        List<Long> list = new ArrayList<>();
//        list.add(1L);
//        list.add(3L);
//        list.add(4L);
//        userDao.selectBatchIds(list);
    }

2.2 逻辑删除

删除操作业务问题:数据从数据库中丢弃,存在一些逻辑问题,例如员工离职,就把员工删除会出现一些关联的表也删除记录,就出现了一些问题;

在这里插入图片描述

逻辑删除:删除时设置状态字段为不可用状态,而不是真的删除数据

在这里插入图片描述

首先实体类字段中添加一个标记状态字段(数据库表中同样要添加一个字段)

//逻辑删除字段,标记当前记录是否被删除
//value表示是默认值为0(与数据库中对应),delval表示逻辑删除值为1
@TableLogic(value = "0", delval = "1")
Integer deleted;

测试删除,并且删除操作之后进行查询操作

@Test
public void testDeleteById(){
	userDao.deleteById(1L);
	System.out.println(userDao.selectList(null));
}

id为1的记录被逻辑删除之后不能被查询出来,如果之后有业务需求,需要将标记字段为0和1的记录都查询出来,需要手动写SQL而不采用MP;
逻辑删除实际执行的是一个update操作,遇到关联删除的话写SQL;

在这里插入图片描述

在实体类中的逻辑删除注解可以做全局配置

mybatis-plus:
  global-config:
    db-config:
      id-type: assign_id
      table-prefix: tbl_
      # 逻辑删除
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

3. 乐观锁(改)

这里乐观锁和悲观锁的一些基本概念

3.1 乐观锁

  1. 乐观锁是一种并发控制机制,它通过假定多个用户同时访问同一数据时并不会发生冲突,从而避免使用繁重的锁机制

  2. 机制就是当某用户对数据进行修改时,系统会先检查该数据的版本号是否与用户开始读取时一样,如果一样则允许修改,如果不一样则表示有其他用户修改过该数据,此时该用户的修改操作将被拒绝,需要重新读取数据并尝试修改。

  3. 乐观锁的好处是可以提高并发访问数据的效率,使用的成本比悲观锁低。但是也存在一定的风险,因为多个用户同时修改同一数据的机会仍然存在,在这种情况下,乐观锁可能会导致数据的不一致性,因此在高并发场景下需要谨慎地使用乐观锁。

3.2 悲观锁

  1. 悲观锁是一种并发控制机制,它假定多个用户同时访问同一数据时会发生冲突,因此在用户访问该数据时会将其锁定,其他用户尝试访问该数据时将会被阻塞,直到该用户释放锁

  2. 悲观锁的优点是能有效地保证数据的一致性,确保在多个用户同时访问同一数据时不会发生冲突。但其缺点也十分明显,因为悲观锁需要对数据进行加锁操作,所以在高并发的情况下,锁的争用会造成较高的系统开销,从而降低系统的性能。此外,如果某个用户持有锁的时间过长,就会导致其他用户的等待时间过长,瓶颈会从数据访问的繁忙程度变成等待锁的繁忙程度,从而限制了系统的吞吐量

  3. 因此,悲观锁一般仅适用于对数据访问冲突的可能性极为高的情况,如对于高并发的写操作而对于一些比较低并发度的场景,尽量使用乐观锁等其他更轻量级的并发控制方案

3.3 MP实现乐观锁(改操作)

实体类中添加对应字段,设定该字段为版本号标记字段

@Version
private Integer version;

MP中需要配置拦截器实现锁机制对应的动态SQL语句拼装(分页查询也需要配拦截器)

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1.定义MP拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2.添加分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //3.添加乐观锁拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        
        return mybatisPlusInterceptor;
    }
}

使用乐观锁机制在修改前必须先获取到对应数据的version方可正常进行

  1. 执行修改之前先要获取version值,所以先要进行查询操作
  2. 执行修改是使用version字段作为乐观锁检查依据

在这里插入图片描述

@Test
public void testUpdate(){
	//1.先通过要修改的数据id将当前数据查询出来
	User user = userDao.selectById(3L);     
	User user2 = userDao.selectById(3L);  
	  
	user2.setName("Jock aaa");
	userDao.updateById(user2);    
	          
	user.setName("Jock bbb");
	userDao.updateById(user);               
}

只有user2修改成功,验证了MP实现乐观锁机制

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue完美模拟pc版快手实现短视频,含短视频详情播放

目录 一、预览 二、效果图 项目实现的demo效果图&#xff1a; 三、项目细节说明 1.项目结构、设计说明 2.项目可拓展能力题外话&#xff08;看不懂可以忽略&#xff09; 3.项目路由配置 4.框架布局页面源码 5.首页实现 四、总结 一、预览 本作品demo预览地址&#xff1…

测试工程师该何去何从?写给30+岁的测试工程师!

前言&#xff1a; 软件测试是为了发现程序中的错误而执行程序的过程。 通俗的说&#xff0c;软件测试需要在发布软件之前&#xff0c;尽可能的找软件的错误&#xff0c;尽量避免在发布之后给用户带来不好的体验&#xff0c;并要满足用户使用的需求。 首先今年行情肯定比去年好…

【Java|多线程与高并发】线程的中断的两种方法

文章目录 1.前言2. 方法1: 自定义标志位3. 方法2:使用标准库自带的标志位4.总结 1.前言 线程中断是指在一个线程执行的过程中&#xff0c;强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束. 本文主要介绍线程中断的两种方法…

电力通信机房如何管理?你绝对想不到!

在信息化建设中&#xff0c;机房运行是信息交换管理的核心。机房内的所有设备必须始终正常工作&#xff0c;否则一旦某个设备出现故障&#xff0c;就会对数据传输、存储和系统运行造成威胁&#xff0c;进而影响全局系统的运行。 机房内的3大安全隐患 01.典型的事故包括电气、消…

HighCharts图表的呈现

HighCharts用法说明地址&#xff1a;Highcharts API 文档 | Highcharts 通过地址打开会出现新版&#xff0c;也可以切换到旧版&#xff0c;以上图是旧版&#xff0c;旧版有详细的备注更方便使用 大致的界面呈现上方提供的地址可以实现&#xff0c;在这个地方主要说明几个注意点…

耗时108天,终于有人把金九银十面试必问的1309道Java面试题全部整理出来了

就目前大环境来看&#xff0c;跳槽成功的难度比往年高很多。一个明显的感受&#xff1a;互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;不少大厂&#xff0c;如阿里、腾讯、华为的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;其实&#xf…

AI安防视频融合平台EasyCVR服务启动异常的原因排查与解决

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持多协议、多类型的设备接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大…

求子网掩码的有效地址

第一步&#xff1a;通过题目可以得知&#xff0c;这个子网掩码属于C类&#xff0c;故ABCD四个选项&#xff0c;我们只需要看最后一位 第二步&#xff1a;题干给的是224&#xff08;我们只需要知道哪8位二进制数加起来等于224即可&#xff09; 很明显这个192<224&#xff1b…

在线时间戳在代码签名中起什么作用?

代码签名为可执行文件提供完整性证明&#xff0c;确保它们未被修改或损坏。许多现代操作系统需要代码签名机制&#xff0c;以保护其用户免受未知来源或没有真实性保证的软件代码的侵害。与HTTPS类似&#xff0c;证书颁发机构创建的受信任证书颁发给软件开发者&#xff0c;由软件…

Swin-Transformer网与源码

论文名称&#xff1a;Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 原论文地址&#xff1a; https://arxiv.org/abs/2103.14030 官方开源代码地址&#xff1a;https://github.com/microsoft/Swin-Transformer Pytorch实现代码&#xff1a; pytor…

燕小千AIGC大模型集成,实现企业文档的智能问答,燕千云v1.21.0全新版本与你“童”行!

5月26日&#xff0c;燕千云数智化业务服务平台发布了1.21版本&#xff0c;此次版本大升级主要围绕系统易用性提升&#xff0c;对在线客服、智能助理及企微移动端进行优化、新增上下游管理、重复问题分析等功能&#xff0c;多方面增加了IT服务的场景&#xff0c;从功能层面深化了…

CnOpenData上市公司社交媒体账号数据

一、数据简介 据《上市公司信息披露管理办法》&#xff0c;上市公司作为信息披露义务人&#xff0c;应真实、准确、及时、完整地向市场公开依法及自愿披露的信息。这些公开披露的信息包含但不仅限于公司基本情况、主要会计数据和财务指标、股东持股情况、高管薪酬情况等。上市公…

字节面试这么难?6年测开被暴虐.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

做长尾关键词究竟能给网络营销带来什么好处呢

众所周知&#xff0c;长尾关键词具有很强的目的性&#xff0c;就说明用户对于此种性质的关键词是有一定需求的&#xff0c;所以就很容易使用户准确的找到自己想要的内容&#xff0c;通过它带来的客户&#xff0c;转化为网站产品客户的概率会比目标关键词高很多&#xff0c;因此…

mysql8中的sys和mysql消失不见了

只要你没有主动删除过这个两个库&#xff0c;那么这两个库不见了是正常的。 rootubuntu:/etc/mysql/mysql.conf.d# mousepad mysqld.cnf skip-grant-tables 保存后关闭 service mysql restart -------------------------------------------------------------------------…

Qt学习之旅 - 标准对话框

文章目录 消息对话框错误对话框信息对话框提问对话框警告图标 其他标准对话框QColorDialog:颜色对话框QFileDialog:选择文件或者目录QFontDialog:选择字体QInputDialog: 允许用户输入一个值&#xff0c;并将赋值返回QPageSetupDialog:为打印机提供纸张相关选项QPrintDialog: 打…

【6.07 代随_50day】 买卖股票的最佳时机 III、买卖股票的最佳时机 IV

买卖股票的最佳时机 III、买卖股票的最佳时机 IV 买卖股票的最佳时机 III1.动态规划方法图解步骤递归代码 买卖股票的最佳时机 IV1.动态规划方法图解步骤代码 买卖股票的最佳时机 III 力扣连接&#xff1a;123. 买卖股票的最佳时机 III&#xff08;中等&#xff09; 1.动态规…

公司来了个卷王之王,真让人崩溃····

现在的小年轻真的卷得过分了&#xff0c;真是完全不把自己当人啊 这不&#xff0c;前段时间我们公司来了个98年的&#xff0c;工作没2年&#xff0c;跳槽到我们公司起薪就18K&#xff0c;都快接近我了&#xff0c;以后超越我只是时间问题&#xff0c;后来才知道人家是个卷王&a…