Spring Boot学习篇(六)

news2024/9/28 19:19:04

Spring Boot学习篇(六)

mybatis-plus使用篇(二)

1 新增

1.1 示例代码

@Autowired
    ISongsService songsService;
@Test
    public void add(){
        Songs s=new Songs(null,"11","xx",null,"xx歌曲","2020-02-12");
        songsService.save(s);
        System.out.println(s);
    }

1.2 运行截图

在这里插入图片描述

2 修改

2.1 单条修改updateById

2.1.1 语法
// 根据 ID 选择修改,entity指的是实体类的意思,
//注意:①仅会根据主键id修改实体类中不为null的非主键字段。
//②若使用的数据库是MySQL,那么实体类的主键字段前必须加上@TableId注解
boolean updateById(T entity);
2.1.2 示例代码
@Autowired
    ISongsService songsService;
@Test
    public void updateOne(){
        // 根据 ID来修改
        Songs songs = new Songs(1002, "凤凰传奇", null, null, "策马奔腾", null);
        boolean b = songsService.updateById(songs);
        System.out.println("更新结果:"+b);
    }
2.1.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

2.1.4 单条修改前后数据对比
a.1 单条修改前

在这里插入图片描述

a.2 单条 修改后

在这里插入图片描述

2.2 批量修改updateBatchById

2.2.1 语法
// 根据ID 批量更新, entityList传的是集合Collection的实现类,可以是ArrayList
//注意:①仅会根据主键id批量修改实体类中不为null的非主键字段。
//②若使用的数据库是MySQL,那么实体类的主键字段前必须加上@TableId注解
boolean updateBatchById(Collection<T> entityList);
2.2.2 示例代码
@Test
    public void updateMore(){
        // 根据 ID来批量更新,也是不为null的非主键字段都会更新
        List<Songs> list=new ArrayList<>();
        list.add(new Songs(1002, "周杰伦", null, null, "七里香", null));
        list.add(new Songs(1004, "汪苏泷", null, null, "三国杀", null));
        list.add(new Songs(1005, "凤凰传奇", null, null, "荷塘月色", null));
        boolean b = songsService.updateBatchById(list);
        System.out.println("批量更新结果:"+b);
    }
2.2.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

2.2.4 批量修改前后数据对比
a.1 批量修改前

在这里插入图片描述

a.2 批量修改后

在这里插入图片描述

3 删除

3.1 单条删除

3.1.1 语法
// 根据 ID 删除,可以传Integer或者String类型的数据,因为都实现了java.io.Serializable接口
boolean removeById(Serializable id);
3.1.2 示例代码
//常规删除:删除单条
    @Test
    public void deleteOne(){
        boolean b = songsService.removeById(1004);
        System.out.println("删除单条结果:"+b);
    }
3.1.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

3.1.4 单条删除前后数据对比
a.1 单条删除前

在这里插入图片描述

a.2 单条删除后

在这里插入图片描述

3.2 批量删除

3.2.1 语法
// 删除(根据ID 批量删除)
boolean removeBatchByIds(Collection<?> list)
3.2.2 示例代码
 //常规删除:批量删除
    @Test
    public void deleteMore(){
        List<Integer> list=new ArrayList<>();
        list.add(1002);
        list.add(1005);
        boolean b = songsService.removeBatchByIds(list);
        System.out.println("结果:"+b);
    }
3.2.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

3.2.4 批量删除前后数据对比
a.1 批量删除前

在这里插入图片描述

a.2 批量删除后

在这里插入图片描述

4 逻辑删除

4.1 含义&&使用注意点

并不是真正的从数据表删除这条数据,而是将表中的逻辑删除字段的值变更为1(此时就代表逻辑删除成功了)
注意:①若是自定义sql,就需要自己写where子句
     ②默认是以0表示未删除,1表示已删除
     ③逻辑删除本质就是更改表的某个字段,在查询和更新的时候给定规则去进行筛选

4.2 更新表结构(增加逻辑删除字段)

4.2.1 右键设计表

在这里插入图片描述

4.2.2 在表中添加字段del

在这里插入图片描述

4.3 更新实体类(加上逻辑删除属性)

4.3.1 需要添加的内容
 @TableLogic
    private Integer del;
4.3.2 完整的实体类代码
package com.zlz.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.*;

/**
 * <p>
 * 
 * </p>
 *
 * @author zlz
 * @since 2023-01-02
 */
//①改动地方1
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Songs implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String singerName;

    private String album;

    private String albumImg;

    private String name;
    //②改动地方2,调成String形式,就不用转型了
    private String releaseDate;
    //需要加上属性名   @TableLogic表示逻辑删除
    @TableLogic
    private Integer del;
}

4.4 测试

4.4.1 示例代码
@Test
    public void remove(){
        boolean b = songsService.removeById(1006);
        System.out.println("逻辑删除结果: "+b);
    }
4.4.2 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

4.4.3 逻辑删除前后数据对比
a.1 逻辑删除前

在这里插入图片描述

a.2 逻辑删除后

在这里插入图片描述

4.5 演示加了逻辑删除后,查询的变化

4.5.1 示例代码
@Test
public void find(){
    Songs s=songsService.getById(1006);
    System.out.println("逻辑删除后再查该数据的结果:"+s);
}
4.5.2 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

4.6 演示加了逻辑删除后,更新的变化

4.6.1 示例代码
@Test
    public void updateOne(){
        // 根据 ID来修改
        Songs songs = new Songs(1006, "凤凰传奇", null, null, "策马奔腾", null,null);
        boolean b = songsService.updateById(songs);
        System.out.println("配置了逻辑删除后,更新的结果为:"+b);
    }
4.6.2 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

4.6.3 配置了逻辑删除后更新,前后数据的对比情况
a.1 更新前

在这里插入图片描述

a.2 更新后

在这里插入图片描述

6 乐观锁

6.1 简要说明

① 当要更新一条记录的时候,希望这条记录没有被别人更新
② 为了解决多个用户同时修改相同的数据时的冲突问题
③ 乐观锁是业务的实现(代码不加锁)
④ 修改时,会根据版本修改,修改成功后会递增版本
⑤ 乐观锁只是修改的时候起作用,支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime

6.2 更新表结构(增加版本字段)

6.2.1 右键设计表

在这里插入图片描述

6.2.2 在表中添加字段v

在这里插入图片描述

6.3 更新实体类(加上版本属性)

6.3.1 需要添加的内容
@Version
    private Integer v;
6.3.2 完整的实体类代码
package com.zlz.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.*;

/**
 * <p>
 * 
 * </p>
 *
 * @author zlz
 * @since 2023-01-02
 */
//①改动地方1
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Songs implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String singerName;

    private String album;

    private String albumImg;

    private String name;
    private String releaseDate;
    //② 乐观锁配置
    @Version
    private Integer v;
}

6.4 变更PlusConfig类

6.4.1 需要加入的内容
//加上乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
6.4.2 完整的PlusConfig代码
package com.zlz.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
@MapperScan("com.zlz.mapper")//mapper接口扫描,@MapperScan也可以放在启动类PlusStart上面(启动类也算配置类)
public class PlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //设置分页插件,别的拦截器也是addInnerInterceptor加入进去
        PaginationInnerInterceptor pi = new PaginationInnerInterceptor();
        pi.setDbType(DbType.MYSQL);//设置数据库类型为MySQL
        pi.setOverflow(true);//溢出分页处理,默认是false不处理,需要设置成true,保证分页合理化
        interceptor.addInnerInterceptor(pi);
        //加上乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

6.5 自己写代码模拟测试

6.5.1 示例代码
@Test
public void positiveLock(){
    //查询到的版本都是一样的
    Songs s1 = songsService.getById(1006);
    Songs s2 = songsService.getById(1006);
    //模拟修改
    s1.setName("光年之外");
    //第一个用户修改成功后,版本会加1
    boolean b1 = songsService.updateById(s1);
    System.out.println("第一个用户修改的结果: "+b1);
    //第二个用户并发修改时 版本就会查询不到,就会修改失败
    boolean b2 = songsService.updateById(s2);
    System.out.println("第二个用户修改的结果: "+b2);
}
6.5.2 运行结果
a 第一个用户修改结果

在这里插入图片描述

b 第二个用户修改结果

在这里插入图片描述

6.5.3 数据表数据变化情况
a 模拟前

在这里插入图片描述

b 模拟后

在这里插入图片描述

6.6 使用压力测试工具jmeter测试

6.6.1 在SongsController类加入如下内容
@RequestMapping("update")
@ResponseBody
public boolean update(){
    Songs s = songsService.getById(2);
    return songsService.updateById(s);
}
6.6.2 添加线程组

在这里插入图片描述

6.6.3 添加HTTP请求

在这里插入图片描述

6.6.4 添加结果树

在这里插入图片描述

6.6.5 此时左侧目录结构如下所示

在这里插入图片描述

6.6.6 配置HTTP请求信息

在这里插入图片描述

6.6.7 配置线程组

在这里插入图片描述

6.6.8 测试
a 启动测试

在这里插入图片描述

b.运行截图1

在这里插入图片描述

c 运行截图2

在这里插入图片描述

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

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

相关文章

linux之vim编辑器

文章目录1. 概念2.安装3. vim的使用1.使用一些按键没有反应2. 模式转换1.命令模式转换到插入模式1. a2. i3. o2.命令模式切换到底行模式1. 退出3. 整体概念图4. 热键的使用1. 命令模式下1.复制——yy 粘贴——p复制若干行—— n yy粘贴若干行—— n p2. 撤销操作——u3. 对撤销…

03-Alibaba微服务组件Nacos注册中心实战

什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 服务及其元数据管理 Nacos…

陆道培医疗冲刺香港上市:持续亏损,毛利率下滑,陆佩华为董事长

2023年1月3日&#xff0c;陆道培医疗集团&#xff08;下称“陆道培医疗”&#xff09;在港交所递交招股书&#xff0c;准备在港交所主板上市。本次冲刺上市&#xff0c;陆道培医疗拟将募资金额用于河北燕达陆道培医院的扩建及搬迁及上海陆道培医院的开业等。 同时&#xff0c;陆…

新生儿只是睡?了解了他的生长发育情况后就不这么觉得了

在网上看到这样一句话&#xff0c;说:所谓坐月子&#xff0c;其实就是把最需要照顾的产妇和新生儿捆在一起&#xff0c;让他们互相治愈。是的&#xff0c;在很多人眼里&#xff0c;新生儿除了吃饭就是睡觉&#xff0c;照顾起来真的很容易&#xff0c;但是只要了解了新生儿的生长…

Android开发常见问题:为什么不要用Timer?

前言 从刚开始做Android开始&#xff0c;就时刻谨记一条规则&#xff1a;如果有能实现功能的Android API&#xff0c;就不要用Java API。所以我很少用Timer&#xff0c;直到前一阵一个朋友问我&#xff1a; 我有一个Timer计时器&#xff0c;我看logcat已经启动了&#xff0c;为…

嵌入式应该从哪里入手?

就从目前IT行业大的方向上来讲嵌入式工程师相对来讲是非常吃香的&#xff0c;学习嵌入式开发的朋友数量也是非常的多的&#xff0c;那么对于对嵌入式工程师我们应该从哪里入手呢? 下面就根据我自身多年的一个实际的工作经验来给哪些不知道怎么入门的朋友来简单的介绍一下。 前…

C语言进阶——指针(一)

目录 一. 字符指针 二. 指针数组 三. 数组指针 四. 数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 一. 字符指针 在之前&#xff0c;我们就了解到过字符指针 int main() {char aW;//字符变量char* pa&a;//字符指针*…

1.3日报

今天优化了getMobileByScene接口&#xff0c; 测试accountadd接口 遇到的问题与解决 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导致系统错误&#xff0c;在同事帮助下重装了系统&#xff0c;好在保住了文件。但是软件还得重新配置。 getMobileByScene接口在…

精益|什么是价值流图分析(VSM)?

在精益生产管理中&#xff0c;价值流研究主要是指利用制作价值流图&#xff0c;进行价值流图研究可以发现并消除浪费、降低成本&#xff0c;改进企业运营状况&#xff0c;提升企业竞争力。因此进行价值流研究离不开价值流图。 价值流图&#xff08;Value Stream Mapping&#x…

基于KT6368A蓝牙芯片开发智能抖音翻页翻页笔总结

一、功能简介 KT6368A蓝牙芯片也是基于 HID 开发&#xff0c;主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。打开手机蓝牙进行连接&#xff0c;进入视频浏览界面操作对应按键即可。包含一个蓝牙的指示灯&#xff0c;表示是否连接 。同时支持adkey按…

HBase面试题汇总

1、请描述HBse的&#xff1f; 答&#xff1a; Memstore级别&#xff1a;当MemStore的大小达到设置阈值&#xff08;默认128M&#xff09;&#xff0c;会触发flush操作。 1、HBase中Memstore在何时进行数据的flush操作&#xff1f; 答&#xff1a; Memstore级别&#xff1a…

uniapp 填坑之旅---udb微信小程序端显示异常

功能描述&#xff1a;A页面展示列表a&#xff0c;点击a&#xff0c;进入B页面&#xff0c;展示a对象关联的子对象b。在B页面中&#xff0c;通过unicloud-db组件manual模式加载&#xff0c;具体代码按照官网示例来写。问题描述&#xff1a;代码实现后&#xff0c;一直在H5调试&a…

Jmeter安装配置使用超详细教程(亲测有效)

文章目录1、Jmeter下载2、JDK安装3、Jmeter环境部署4、验证jmeter5、修改语言6、接口测试1、Jmeter下载 1.1、下载地址 http://jmeter.apache.org/download_jmeter.cgi 1.2、选择对应版本&#xff0c;本文以windows版本为例&#xff0c;版本号为5.5。 2、JDK安装 jmeter安装…

到底为什么那么多大厂在开始疯狂裁员?

最近几年大家都听到了好多大厂公司开始裁员&#xff0c;比如鹅厂、狗厂、鸟厂、熊厂等。 接下来给大家讲个故事&#xff0c;希望故事看完&#xff0c;你就会懂了&#xff01; 外国的神父呆了不久 留下几个 P 就走了&#xff0c; 一个 P 叫 BPR&#xff0c; 一个 P 叫 ERP。 …

作业1/4 设备树总结

1.什么是设备树 设备树&#xff08;Device Tree)是用来描述&#xff08;存储&#xff09;硬件信息的一种树形结构&#xff0c;设备树在linux内核启动的时候传递给内核被内核解析&#xff0c;用来描述设备信息的一种方式&#xff08;地址&#xff0c;中断号...&#xff09;。设备…

《收获,不止Oracle》表的设计之五朵金花

表设计主要强调什么场合该选择什么技术&#xff0c;没有最高级的技术&#xff0c;只有最适合的技术。 1.表的特性 普通堆表的不足之处 1.查看产生多少日志 [oracleoracle-db-19c ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 4 14:27:13 20…

电商数据监测的应用价值——国内吸尘器行业数据浅析

随着科技的发展与居民生活水平的提高&#xff0c;吸尘器进入日常生活&#xff0c;成为了常见家用清洁用具之一。2022年上半年&#xff0c;吸尘器市场零售额达145亿元&#xff0c;同比增速达14.0%&#xff0c;零售量1008万台&#xff0c;同比下跌2.8%。&#xff08;数据来源&…

Hadoop HA高可用

文章目录Hadoop HA高可用1.1 HA概述1.2 HDFS-HA工作机制1.2.1 HDFS-HA工作要点1.2.2 HDFS-HA自动故障转移工作机制1.3 HDFS-HA集群配置1.3.1 环境准备1.3.2 规划集群1.3.3 配置Zookeeper集群1&#xff09;集群规划2&#xff09;解压安装3&#xff09;配置zoo.cfg文件4&#xff…

药品需求加大,蒸汽发生器等制药设备该如何快速有效地进行维护?

一、行业背景药品的生产与制造的每一道关卡都是十分严格的&#xff0c;一方面&#xff0c;涉及到化工污染问题&#xff0c;制药的废气一旦没有得到妥善处理&#xff0c;则会危及到周边居民以及企业工作人员的健康。另一方面&#xff0c;药品本着治病救人的原则&#xff0c;其品…

[Android]序列化原理Serializable

引入 我们知道&#xff0c;当一个程序终止时&#xff0c;这个程序创建的对象也会随着程序终止&#xff0c;那么我需要如何做才能不受其他程序的状态影响并且可以得到其他程序创建的对象状态呢&#xff1f;这时候我们就可以使用Serializable来进行序列化把对象持久化到存储设备上…