MyBatisPlus从入门到精通-3

news2024/9/28 23:34:39

紧接着上一篇的查询
接下来的重点介绍增删改操作了

Insert

id(主键)生成策略

前面的案列中我们没有指定id字段
但是它是生成了一个很长的id,并不是我们数据表定义自增
这是Mp内部算法出来的一个值
其实根据不同应用场景,应该使用不同的算法来生成主键的值
那么如何指定对于算法呢
在这里插入图片描述
我们需要使用@TableId注解,更改属性type来指定算法类型
如图
在这里插入图片描述
比如@TableId(type = IdType.AUTO)也就是自增类型
新增的就会在原来的id自增
在这里插入图片描述

 @Test
    void testInsert(){
        User user = new User();
        user.setName("小马");
        user.setAge((short)10);
        user.setGender((short)1);
        user.setPhone("110");
        userDao.insert(user);

    }

成功添加成功并且实现我们想要的效果
在这里插入图片描述

id具体类型

类型说明
AUTO数据库ID自增,需保证对应ID为自增
NONE就是没有策略
INPUT用户需要自己输入ID的值(必须写)
ASSIGN-ID雪花算法,分配ID,主键类型为number或string,整合过时的ID-WORKER和ID-WORKER_STR
ASSIGN-UUID分配UUID,主键类型为string
ID_WORKER过时,被ASSIGN_ID整合
ID_WORKER_STR过时,被ASSIGN_ID整合
UUID过时,被ASSIGN_UUID替代

原先ID_WORKER和ID_WORKER_STR就是雪花算法生成的,前者生成整数,后者生成字符串,两个整合成了ASSIGN-ID
同时ASSIGN-ID也是我们现在的默认使用的ID生成类型,且如果你指定了ID的话,会先用指定的

雪花算法解析

具体来搜一下雪花算法
就是生成64个位数,即8字节,所以数据库用BIGINT存储,Java程序中用Long存储
具体对应的位数有什么含义呢?
第一位占位符固定为0
2-42位是一个时间戳,精确到毫秒
43-53位是机器码,前五位群组标记,后五位机器标记(可以简单理解为mac地址)
最后12位是我们的序列号
为了防止生成的ID重复设置这样的格式,序列号的作用接收,可能一个机器在一毫秒内接收多个ID生成请求,为了防止重复,第一个请求的序列号就为1,这样就减少重复的概率
在这里插入图片描述

全局配置ID类型即表名前缀

如标题所言
可以直接配置所有的ID生成id的策略
在对应的spring配置文件中,这样写即可

mybatis-plus:
  global-config:
    db-config:
      id-type: assign_id

在这里插入图片描述
然后就可以注释到对应的@TableId效果是相同的
在这里插入图片描述
你甚至可以用全局配置来配置对应sql前缀就不用写实体类上的
@TableName(“tbl_user”),因为全局设置前缀就是tbl_
自动匹配类名小写拼接成tbl_user即数据库表名
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Delete

多数据删除

删除一条数据很简单,之前也演示过-deleteById
我们主要讲解怎么一下删除多行数据
我们删除多行就是用deleteBatchIds方法,传参为集合,集合内容为ID,就会把对应集合中存储的ID数据删除
在这里插入图片描述
在这里插入图片描述
同样的我们的select也有该功能
效果一样的
在这里插入图片描述

逻辑删除

一些数据,经过逻辑外键加持
如果你进行对应的员工删除,对应的业务也会消失,统计公司今年总体业务就可能有问题
所以我们要用软删除
可以用一个字段进行标记,这就叫逻辑删除
Mp给我们提供了注解,在下面的具体做法会讲到
在这里插入图片描述
逻辑删除操作
1.规定对应值的状态,我这里规定0为正常状态,1为被删除状态
2.在对应的表中添加字段(记得设置默认值,为没有离职)
在这里插入图片描述
3.在实体类中加上对应属性
需要加上@TableLogic(value=“没有删除对应状态值”,delval=“被删除对应的状态值”)
value决定了查询时的增添条件,delval影响删除数据时对应值的变化

在这里插入图片描述

我们测试一下,看看会不会真的删除
删除ID为1的数据
在这里插入图片描述
测试成功,只是deleted属性变为了1
在这里插入图片描述

看它底层执行的语句,执行的是update语句的
只有没有被删除且id匹配时会把deleted(逻辑删除属性/字段)改为1(删除状态值)

update 表名 set deleted=1 where id=? AND deleted=0

在这里插入图片描述
只弄这个字段修改可能大家认为还是能查询到(没有达到真正删除的效果),接下来我们就测试一下,逻辑删除能不能达到删除的效果
那我们就查一下整个全表呗
在这里插入图片描述
返回值
可以看到是没有id为1,即被逻辑删除的数据了
why?
看底层执行的sql语句

select id,name,age,tel,deleted from tbl_user where deleted=0

现在基本就能理解,就是我们设为逻辑的属性,会在sql查询的时候默认作为一个条件,where 逻辑删除属性=“没有被删除的状态值”
在这里插入图片描述
所以,我们基本可以了解@TableLogic的两个属性的作用了

全局设置逻辑删除

也就是value和delval两个值
为了防止写错和提高代码复用性,我们可以进行全局设置
在这里插入图片描述

在spring配置文件下进行修改

mybatis-plus:
  global-config:#全局设置
    banner: false
    db-config:#数据库相关设置
      id-type: assign_id
      #这个就是我们想设置成逻辑删除属性的属性名
      logic-delete-field: deleted
      #被逻辑删除的状态值
      logic-delete-value: "1"
      #未被逻辑删除的状态值
      logic-not-delete-value: "0"

小结

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Update

修改嘛
基础操作没什么好讲的
重点是可能遇到的问题
可能我们上架一个需要抢的产品
如果最后一个同时又好几个用户要抢,我们可能就会update把我们的商品剩余数变为负数
为了避免这种并发问题
我们可以用乐观锁

乐观锁

乐观锁适用于较少的请求量
在这里插入图片描述
那么乐观锁怎么实现呢?
同样
1.设置一个sql字段来记录目前是谁在操作这条数据(这条数据是第几版)
就是,比如是我们只有1000个商品,version从1到1000的数据就会被我们收集起来,多出的数据就不会收集,然后统计信息发货
一般名为version,int类型
在这里插入图片描述
2.写对应的类属性
并且用@Version注解标注
在这里插入图片描述

加锁的实现过程,主要是sql语句的变更进行的加锁

update set abc = 1 	version=version+1	where version=1

为什么这样能实现锁的功能?
比如我是用户a,另一个是用户b,我们都在version=1的时候进行修改数据,b先修改了数据,对应version发生改变,变成了2,然后我执行语句的时候有一个version=1的限制条件,我就没法修改了
可以看出,这段其实是先查后改,先查version的值,然后
update set … version=version+1 where version=查到的值

乐观锁拦截器!

我们肯定是要在对应的sql加上一些语句
就像之前的分页,我们用拦截器实现,这里乐观锁也是用拦截器实现
version的作用只是告诉拦截器要对哪个字段进行操作
在这里插入图片描述
具体还是想分页拦截器那样,把乐观锁拦截器对应的类加入到Mp拦截器群中,就能加sql语句了
在这里插入图片描述

然后就是,我们修改数据的时候,一定要设置version才会有效
不要太天真,执行的语句是

update set ... version=version+1 where version=对象中的version值
如果没有 version值的话也起不到锁的作用

还有就是一般是先查,然后返回结果给version嘛
全代码应该是这样的
就是我们是直接把对应的对象给返回,对应version也会自动赋值上去
然后我们再修改我们想要改的(而不是查询对应的version再set)

在这里插入图片描述
下图就是加锁的代码+思路
和我们上面分析的一样
在这里插入图片描述
看一下对应的日志
可以看到第二句并没有执行
在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码生成器

概述

其实这里就和CRUD没关系了
这个是提高开发效率的
就是快速生成Mp的代码
在这里插入图片描述
比如Dao
其实就跟造句一样,就是填入那些不固定的
Dao层不固定是什么,就是我们对应里的实体类的导入啊
就是如图三个空格,添加的就是我们的实体类
就是
模板+参数
在这里插入图片描述
然后我们简化一下实体类开发,看看怎么简化
就是我们可以分为两个参数
一个就是从数据库读取的,一个是人为设置的
这样也是一套模板
在这里插入图片描述
Mp就把这些模板抽取出来,就做了一个代码生成器

实战!

使用代码生成器
步骤
1.导入依赖
需要导入在maven导入依赖
1.代码生成器依赖 2.模板依赖
在这里插入图片描述
2.创建Generator
里面写个main方法
创建代码生成器,添加一系列配置(因为是有点是从数据库还要读取信息,所以数据库信息肯定是要配置的),然后执行代码生成器
配置的话,主要是数据库的配置
新建一个数据库配置类,然后用set方法定义对应的url和username,password等信息
在这里插入图片描述
但是你运行后
他就会弹窗出来对应输出的文件夹位置,默认就直接生成在d盘
但是和我们想的还是不对(我们想直接生成在项目文件中)
在这里插入图片描述
3.在Genertor里多填一些信息
不止数据库的信息

新建一个全局配置类
设置对应的输出目录
生成完毕后,不直接打开目录
设置作者(就是添加一个注释,写上作者名)
设置如果前面输出过,是否覆盖
setMapperName设置数据层接口名
setIdType这个就不多说,id生成策略

在这里插入图片描述
生成后可以看到
默认的包是com.baomidou
不会在itheima包下直接生成

在这里插入图片描述
还有就是setMapperName
默认生成的接口名字是
数据库表名(首字母大写)+Mapper
然后

setMapperName("%sDao")设置数据层接口名,%s就占位符,就对应的数据库表名首字母大写
所以我们输出的就是Tbl_logDao

在这里插入图片描述

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

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

相关文章

抖音SEO源代码的部署与搭建技巧详解

抖音SEO源代码的部署与搭建是一项重要的技术,促进了抖音的发展。在此,我将为大家详细介绍抖音SEO源代码的部署与搭建技巧。 首先,我们需要了解抖音SEO源代码的含义。SEO源代码是搜索引擎优化的核心,它是用于帮助搜索引擎更好地理解…

PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展

PHP使用Redis实战实录系列 PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展 数据类型…

pytorch的发展历史,与其他框架的联系

我一直是这样以为的:pytorch的底层实现是c(这一点没有问题,见下边的pytorch结构图),然后这个部分顺理成章的被命名为torch,并提供c接口,我们在python中常用的是带有python接口的,所以被称为pytorch。昨天无意中看到Torch是由lua语言写的&…

docker 部署 mysql8.0 无法访问

文章目录 🗽先来说我的是什么情况🪁问题描述🪁解决方法:✔️1 重启iptables✔️2 重启docker 🪁其他有可能连不上的原因✔️1 客户端不支持caching_sha2_password的加密方式✔️2 my.conf 配置只有本机可以访问 &#…

用JavaScript和HTML实现一个精美的计算器

文章目录 一、前言二、技术栈三、功能实现3.1 引入样式3.2 编写显示页面3.2 美化计算器页面3.3 实现计算器逻辑 四、总结 一、前言 计算器是我们日常生活中经常使用的工具之一,可以帮助我们进行简单的数学运算。在本博文中,我将使用JavaScript编写一个漂…

【我们一起60天准备考研算法面试(大全)-第二十八天 28/60】【枚举】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

VBA技术资料MF35:VBA_在Excel中过滤数据

【分享成果,随喜正能量】好马好在腿,好人好在嘴。不会烧香得罪神,不会讲话得罪人。慢慢的你就会发现,一颗好心,永远比不上一张好嘴。。 我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了&#…

Android实例——自定义控件

自定义View 对现有控件进行扩展 案例一:添加背景 如下继承TextView public class MyTextView extends androidx.appcompat.widget.AppCompatTextView {private Paint mPaint1;private Paint mPaint2;public MyTextView(Context context) {this(context, null);}…

wireshark抓包新手使用教程(超详细)

一、简介 Wireshark是一款非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。 为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。 wireshark能获取HTTP,也…

day47-Testimonial Box Switcher(推荐箱切换器-动态进度条自动更新卡片信息)

50 天学习 50 个项目 - HTMLCSS and JavaScript day47-Testimonial Box Switcher&#xff08;推荐箱切换器-动态进度条自动更新卡片信息&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

Docker续集+Docker Compose

目录 Containerd与docker的关系 runCrunC与Containerd的关联 OCI协议Dockerfile多阶段构建&#xff08;解决&#xff1a;如何让一个镜像变得更小 &#xff09;多阶段构建Images瘦身实践.dockerignore Docker Compose快速开始Quick StartCompose 命令常用命令命令说明 Compose 模…

11. Mybatis 的增删查改【万字详解】

目录 1. 数据的查找 select 1.1 查询所有数据 1.2 通过 id 进行查找 2. 插入数据 insert 3. 修改数据 update 4. 删除数据 delete 5. $ 和 # 的区别 5.1 SQL 注入 用户登录 6. Spring Boot 打印 SQL 日志 7. order by 排序 8. like 查询 9. 通过页面返回数据 10. …

C++--菱形继承

1.什么是菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承的问题&#xff1a;菱形继承有数据冗余和二义性的问题&#xff0c;数据冗余是由于创建多个相同类型的…

【C++】优先级队列的基本概念以及其模拟实现

文章目录 补充知识&#xff1a;仿函数一、优先级队列&#xff1a;1.引入2.介绍 二、priority_queue的模拟实现1.大体框架2.私有成员函数&#xff1a;1.向下调整&#xff08;AdjustDown&#xff09;2.向上调整&#xff08;AdjustUp&#xff09; 3.公有成员函数1大小&#xff08;…

Windows驱动第一节(什么是驱动?)

本文来自微软,由本人兴趣爱好人工翻译(非机翻) What is a driver? - Windows drivers | Microsoft Learn 我想很难给驱动这个词一个准确的定义.最基础的定义是驱动是一个用于让操作系统和硬件设备通信的软件组件. 举一个例子,假设一个应用程序需要从硬件设备读取一些数据,这…

2023河南萌新联赛第(三)场:郑州大学 A - 发工资咯

2023河南萌新联赛第&#xff08;三&#xff09;场&#xff1a;郑州大学 A - 发工资咯 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 一个公司有n个人&#xff0c;每个月都…

C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)

C类与对象 - 3 1. 拷贝构造函数1.1 概念1.2 特征 2. 赋值运算符重载2.1 运算符重载2.2 赋值运算符重载记点2.3 前置和后置重载 3. const成员函数记点 4. 取地址及const取地址操作符重载 1. 拷贝构造函数 1.1 概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#x…

RK3566 android代码编译

一、搭建环境 所用的ubuntu系统之前已编译过linux代码&#xff0c;所以只需安装编译android所需的环境。 安装jdk-8 如果之前系统没有安装则执行以下命令安装&#xff1a; sudo apt-get install openjdk-8-jdk 查看当前系统是否有jdk-8 $ sudo update-alternatives --conf…

奇舞周刊第 501 期:前端打包加个性能插件检测~ 性能不过关就发邮件告诉领导!...

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 前端打包加个性能插件检测~ 性能不过关就发邮件告诉领导&#xff01; 本文作者结合 Lighthouse 是一个开源的自动化工具&#xff0c;给组内的项目都在 CICD 流程上更新上了性能守卫…

每日一博 - How To Improve API Performance

文章目录 包括但局限于以下措施1. 采用分页显示2. 异步记录日志3. 利用缓存技术4. 实施负载压缩5. 管理数据库连接池 包括但局限于以下措施 1. 采用分页显示 当查询结果过多时&#xff0c;将结果分为多个页面进行显示&#xff0c;可以有效地提高系统的响应速度。这样&#xff…