MybatisPlus【进阶】--悲观锁,乐观锁,生成后台数据:javafaker

news2024/10/7 2:30:21

什么是悲观锁

悲观锁:十分悲观,认为总是出现问题,无论干什么都会上锁,再去操作

悲观锁是基于一种悲观的态度类来防止一切数据冲突,它是以一种预防的姿态在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对其数据进行操作,直到前面一个人把锁释放后下一个人数据加锁才可对数据进行加锁,然后才可以对数据进行操作,一般数据库本身锁的机制都是基于悲观锁的机制实现的;

特点:可以完全保证数据的独占性和正确性,因为每次请求都会先对数据进行加锁, 然后进行数据操作,最后再解锁,而加锁释放锁的过程会造成消耗,所以性能不高;

配置乐观锁

本文主要讲解乐观锁机制:乐观锁实现方式:

具体思路:

取出记录时,获取当前version,更新时,带上这个version,执行更新时,

set version = newVersion where version = oldVersion

如果version不对,就更新失败当要更新一条记录时,是希望这条记录没有被更新的,同时修改的version会加一的。

步骤:

1.在实体中定义version且加上注解:

默认是1:

查看日志:

2:定义乐观锁的插件在MybatisPlusConfig中

package com.lya.springbootmybatisplus.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//        乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

调用方法:

    @RequestMapping("/update")
    public Object update(){
        Book byId = bookService.getById(214929409L);
        Book b = byId.setBookname("启用了乐观锁");
        return bookService.updateById(b);
    }

查看:

2.生成后台数据:javafaker

1.先到依赖:

测试类BootApplicationTests
package com.lya.springbootmybatisplus;

import com.github.javafaker.Faker;
import com.lya.springbootmybatisplus.pojo.Book;
import com.lya.springbootmybatisplus.service.IBookService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Locale;

@SpringBootTest
class BootApplicationTests {

    @Autowired
    private IBookService bookService;

    @Test
    public void test() {
        for (int i = 0; i < 100; i++) {
            Book book = new Book();
            Faker faker = new Faker(Locale.CHINA);
            book.setBookname(faker.name().fullName());
            book.setPrice((float) faker.number().randomDouble(2, 100, 999));
            bookService.save(book);
        }
    }

}

这里给数据库添加100条后台数据都是不重复的:

效果:

3.逻辑删除

物理删除:从数据库中直接删除

逻辑删除:在数据库中没有被删除,而是通过一个变量来让它失效。 statu=1改变成:statu=0

独特优势:

  1. 数据保留:逻辑删除可以保留被删除数据的历史记录,使其可以用于后续审计、恢复或者分析目的。这对于数据的完整性和追溯性非常有价值。

  2. 数据恢复:逻辑删除的数据可以在需要时进行恢复,而无需使用备份或其他复杂的恢复机制。这对于用户误删或系统问题导致的数据删除非常有帮助。

  3. 数据关联性:逻辑删除可以维护数据之间的关联性。当一个数据被物理删除时,与之相关联的其他数据可能会因为缺失引用而出现问题。而逻辑删除可以保留这种关联关系,避免数据不一致性。

  4. 安全性考虑:逻辑删除可以提高数据安全性。通过标记数据为已删除状态,可以防止未经授权的访问和操作。同时,逻辑删除也可以作为一种数据保护措施,防止敏感数据被永久删除。

  5. 性能优化:逻辑删除相对于物理删除,可以减少数据库的I/O操作和存储空间的占用。在大型数据库中,逻辑删除可以提高系统的性能和响应速度。

需要注意的是,逻辑删除并不适用于所有情况。对于一些敏感数据或者法律要求强制删除的数据,物理删除可能是更加合适的选择。此外,在实现逻辑删除时,需要确保逻辑删除的数据仍然受到适当的访问控制和权限管理。

总的来说,逻辑删除在保留数据历史记录、恢复数据、维护数据关联性和提高安全性方面具有重要性,它是数据库管理中常用的一种策略。

管理员可以查看被删除的记录,防止数据丢失,相当于回收站。

测试:

1、在数据表中增加一个statu字段用来保存逻辑删除的数据:

测试类中添加:

//测试删除
@Test
public void testDeleteById(){
    bookService.removeById(1L);
}

查看数据:

4分页:

1:定义插件:

package com.lya.springbootmybatisplus.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     * 乐观锁插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//        乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//        添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2.controll中调用page

//走分页
    @RequestMapping("/list")
    public Object list(Long current){
        Page<Book> page = new Page<>(current,5);
        return bookService.page(page);
    }

添加查询条件:

package com.lya.springbootmybatisplus.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yitter.idgen.YitIdHelper;
import com.lya.springbootmybatisplus.pojo.Book;
import com.lya.springbootmybatisplus.service.IBookService;
import com.lya.springbootmybatisplus.service.impl.BookServiceImpl;
import freemarker.template.utility.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * �鱾��Ϣ�� 前端控制器
 * </p>
 *
 * @author lixiao
 * @since 2023-12-16
 */
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private IBookService bookService;

//走分页
    @RequestMapping("/list")
    public Object list(Long current,String bookname){
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
//        查询条件
//        方式1:
        queryWrapper.like(String.valueOf(!StringUtils.isEmpty("bookname")),bookname);
        queryWrapper.between("price",10,200);
//        方式2:
//        queryWrapper.like("bookname",bookname)
//                    .between("price",100,200);
//        方式3:
//        queryWrapper
//                .lambda()
//                .like("bookname","bookname")
//                .between("price",100,200);



        Page<Book> page = new Page<>(current,5);
        Page<Book> res = bookService.page(page,queryWrapper);
        res.getTotal();//总条数
        res.getPages();//总页数
        res.getRecords();//json格式
        return res.getRecords();
    }

//新增
    @RequestMapping("/save")
    public Object save(Book book){
        book.setId(YitIdHelper.nextId());
        return bookService.save(book);
    }
//乐观锁
    @RequestMapping("/update")
    public Object update(){
        Book byId = bookService.getById(214929409L);
        Book b = byId.setBookname("启用了乐观锁");
        return bookService.updateById(b);
    }
}

效果:

注:

3.1.查询构造器

QueryWrapper是Mybatis-Plus提供的一个条件构造器,用于快速构建SQL查询语句的条件部分。通过使用QueryWrapper,我们可以方便地进行单表数据的查询、修改、删除等操作。

QueryWrapper的语法类似于Mybatis的XML文件中的where标签,其最终会被转换为SQL语句的条件部分。我们可以通过链式调用的方式,不断添加查询条件,从而构建出复杂的查询条件。

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

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

相关文章

山西电力市场日前价格预测【2023-12-19】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-19&#xff09;山西电力市场全天平均日前电价为562.84元/MWh。其中&#xff0c;最高日前电价为1168.60元/MWh&#xff0c;预计出现在18:00。最低日前电价为361.89元/MWh&#xff0c;预计…

分享!!!(一)小编总结的base64、blob、图片文件二进制相互转换的方式以及源码

目录 第一章 了解 1.1 大概结构 1.2 准备阶段 1.2.1 了解canvas 1.2.2 了解imageData 1.2.3 了解imgUrl 1.2.4 了解base64 1.2.5 了解blob/文件二进制流 1.2.6 了解arraybuffer 1.2.7 文件、图片 第二章 掌握图中的相互转换 2.1 cavas 与 imageData的互相转换 2.1…

基于OpenVidu的视频会议解决方案

OpenVidu是什么 OpenVidu 是一个开源的实时音视频通信平台&#xff0c;基于 Apache 2.0 协议开源的 WebRTC 视频会议平台&#xff0c;源码仓库地址&#xff1a;https://github.com/OpenVidu/openvidu。它提供了一组 API 和 SDK &#xff0c;使开发人员能够轻松地在 Web 和移动…

山区老人爱的礼物丨走进武隆区土地乡为山区老人送温暖

从车水马龙的城市到人烟稀少的乡村&#xff0c;穿越重峦叠嶂的高山&#xff0c;见到的是独属于大山的辽阔和山区老人眼中的星河。近日&#xff0c;传益千里为爱出发&#xff0c;在三棵柚公益基金会的支持下开展“山区老人爱的礼物”公益计划&#xff0c;走进武隆区土地乡&#…

GeoTrust SSL证书:您的网络信任卫士

在如今的数字化时代&#xff0c;我们的网络交易如脉搏般不断跳动&#xff0c;在这个过程中&#xff0c;安全保障尤其重要。于是像GeoTrust这样的品牌应运而生&#xff0c;它向我们承诺一件事情&#xff1a;无论在什么时候&#xff0c;我们的数据和交易都能得到最强的保护。下面…

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

关于 Redis 与传统关系型数据库的选择

当需要为你的应用程序选择合适的数据库时&#xff0c;选择何种数据库通常取决于你项目的特定要求。Redis 是一种高性能的内存数据存储&#xff0c;而 MySQL 等传统关系型数据库也各自具有自己的优势和劣势。在本期文章中&#xff0c;我们将探讨在 Redis 和传统关系型数据库之间…

minio异常处理:S3 API Requests must be made to API port

1、创建minio服务时候需要映射出console端口和api端口&#xff0c;指定console端口和api端口 docker run -p 9000:9000 -p 9099:9099 --name minio -d --restartalways -e "MINIO_ACCESS_KEYadmin" -e "MINIO_SECRET_KEYMINIOE:<&G5*;dL?(fr" -v…

【✅如何针对大Excel做文件读取?】

✅如何针对大Excel做文件读取&#xff1f; &#x1f7e9;如何针对大Excel做文件读取&#x1f7e9;XSSFWorkbook文件读取&#x1f7e9;EasyExcel文件读取 ✅扩展知识&#x1f7e9; EasyExcel简介&#x1f7e9;EasyExcel 为什么内存占用小&#xff1f; &#x1f7e9;如何针对大Ex…

JavaScript中的一些惊艳的编程技巧

你见过哪些令你膛目结舌的代码技巧&#xff1f; 代码世界有很多令人大呼小叫的技巧&#xff01;有的代码像魔术师一样巧妙地隐藏了自己&#xff0c;有的像魔法师一样让你眼花缭乱&#xff0c;还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已&#xff0c;让我们觉得自己仿佛…

检测当前目录,将文件名输出到excel文件并建立链接

EXCEL是一个非常使用的软件,虽然我们平时仅使用他做一些报表,仅此而已; 我在工作中,由于很懒,不愿意做考试重复的工作,就想着使用vba的宏来完成重复的工作,这样就能省出一部分的时间来了。 本人不喜欢在博客里面写以下教程类的东西,我的理念是将工作中的痛点的解决办法…

我记不住的那些vim操作2

背景&#xff1a;最近在重新学习vi/vim&#xff0c;发现这个编辑器的用法真是太灵活了&#xff0c;所能掌控的也太多了&#xff0c;这次学习了一些之前没有学习过的内容&#xff0c;之前都是移动鼠标、编辑、复制、粘贴、保存等等(点我查看)&#xff0c;本次将介绍 标签、区域、…

设计模式-单例设计模式详解

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…

一文图解 Transformer,小白也看得懂(完整版)

原作者&#xff1a;Jay Alammar 原链接&#xff1a;https://jalammar.github.io/illustrated-transformer 1.导语 谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果&#xff0c;引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最…

043.Python异常处理_自定义上下文管理器

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

ESP32 核心闪存损坏

问题描述&#xff1a;使用Platform 开发ESP32-S3 报错通过串口打印报错提示为核心闪存损失具体报错如下。 ELF file SHA256: 25c739c3d81d8f15 E (183) esp_core_dump_flash: Core dump flash config is corrupted! CRC0x7bd5c66f instead of 0x0 Rebooting... ESP-ROM:esp32s3…

Python项目——表白照片墙

1、介绍 利用女神的照片&#xff0c;组成女神的名字&#xff0c;向女神表白。如下图&#xff1a; 原理&#xff1a;获取每个像素点的颜色&#xff0c;白色不贴图&#xff0c;黑色贴图。 2、工具 语言&#xff1a;python3.11编译器&#xff1a;PyCharm包&#xff1a;pygame p…

【IOS开发】传感器 SensorKit

资源 官方文档 https://developer.apple.com/search/?qmotion%20graph&typeDocumentation SensorKit 使应用程序能够访问选定的原始数据或系统从传感器处理的指标。 步骤信息加速度计或旋转速率数据用户手腕上手表的配置物理环境中的环境光有关用户日常通勤或旅行的详细…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

项目实操四-性能测试过程实时监控分析

这里写目录标题 一、JMeter性能测试技巧1、CSV文件驱动2、定时器a、泊松随机定时器b、固定定时器c、高斯随机定时器d、均衡随机定时器e、同步定时器f、固定吞吐量定时器g、精准吞吐量定时器 3、全局变量 - 跨线程数据传递4、Debug调试器5、JMeter执行机端口被占用 二、JMeter性…