Mybatis-plus(下)

news2024/11/17 5:36:24

一,乐观锁

可参考官方文档:https://baomidou.com/pages/0d93c0/

场景:当两个工作人员同时去处理一条投诉工单的时候

两个人一起点开了投诉工单详情 并一起编辑处理 随后同时反馈给用户时 此时就会出现矛盾 当系统正常 没有bug的时候 是会出现两条不同的反馈信息都发送给用户的情况 此时用户的反应:???倒地哪一条是对的?

此时就可以用到乐观锁了

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
取出记录时,获取当前 version
更新时,带上这个 version
执行更新时, set version = newVersion where version = oldVersion
如果 version 不对,就更新失败

配置示例:

1.在数据库表种加入version字段 表示数据版本号

2.在实体类的字段上加上注解@Version

3.配置文件

// Spring Boot 方式
@Configuration
@MapperScan("按需修改")
public class MybatisPlusConfig {

    /**
     * 新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

4.测试乐观锁

//测试乐观锁
@Test
public void testLock01(){
    User user01 = userMapper.selectById(66L);
    User user02 = userMapper.selectById(66L);
    user01.setName("leguansuo01");
userMapper.updateById(user01);
    user02.setName("leguansuo02");
userMapper.updateById(user02);
}

原数据:66L

若没有加乐观锁的情况代码理应对他进行两次操作 也就是最终这条数据的name值为 ”leguansuo02“

但是我们此时已经添加了乐观锁 so 看演示结果

第二遍的修改失败原因:先查看数据库

在第一个修改完成的时候 数据库种的version已经变为2 第二遍修改时指定的还是为1 所以找不带,执行行数就会为0 这样就是使用乐观锁成功阻止了上述场景的发生

注意:乐观锁与悲观锁的区别

参考地址:

http://zhuanlan.zhihu.com/p/63714157

从字面上理解:都是一种锁机制 都是为了保护数据

区别:

乐观锁的角度:认为它锁保护的数据只在极少数的情况下是不安全的, 不容易出现并发问题

悲观锁的角度:认为它所保护的数据在绝大多数的情况下是不安全的,很容易出现并发问题

二,查询构造器

参考地址:

https://baomidou.com/pages/10c804/

1.举例

        //部分举例
//        QueryWrapper qu = new QueryWrapper();
//        qu.eq("id",66L);
//            等价于
//        Select * from user where id =66L

//        qu.ne("name","javaxl");
//         等价于(不为,不=)
//        select * from user where name <> 'javaxl'

//        String sql ="email =12@qq.com and version =2";
//        "等价于 拼接"
//            qu.apply(sql);

2.查证测试代码:

@Test
public void testWrapperLike() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.likeRight("name", "T")
.eq("age", 28);
List<User> users = userMapper.selectList(wrapper);
users.forEach(t-> System.out.println(t));
}

三,分页插件

参考地址:

https://baomidou.com/pages/97710a/

1.添加分页拦截器

mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());

完整:

package com.ljj.mp0111.config;

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;

// Spring Boot 方式
@Configuration
public class MybatisPlusConfig {

    /**
     * 新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//       乐观锁
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//       分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }


}
    • 测试:

 @Test
    public void testSelectPage() {
        PageDTO<User> page = new PageDTO<>();
        page.setCurrent(3);
        page.setSize(3);
//        select * from user limit (3-1)*3,3
        PageDTO<User> pageDTO = userMapper.selectPage(page, null);
        System.out.println(pageDTO.getTotal());
        List<User> records = pageDTO.getRecords();
        records.forEach(t-> System.out.println(t));
    }

3.查询结果:

思考:如何在不同的表中使用共同的分页(提取出重复的代码供不同的表使用)
方法:将共同代码放入查询的前置通知当中 在后置通知中处理结果

四,逻辑删除

在开发过程当中 我们使用的删除操作应该要尽量的去使用逻辑删除(不显示) 而不是物理删除(彻底删除)因为以往的数据可能在日后都会需要到

实现步骤:

    • 添加逻辑删除标识

软件使用过程中所有的查询都带上where deleteid = 0

2.修改实体类

//标记该字段为逻辑删除字段
@TableLogic
private int deleteid;

3. 在application.properties (或application.yml)中加入如下配置

#逻辑删除字段名
mybatis-plus.global-config.db-config.logic-delete-field=deleteid
# 1表示逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
# 0 表示未删除
mybatis-plus.global-config.db-config.log
    • 测试

@Test
public void testDeleteLogic() {
int i = userMapper.deleteById(1L);
System.out.println(i);
}

五,在Mybatis-plus中使用xml配置

mybatis-plus是mybatis的升级版,所以在mybatis-plus中使用xml的配置比较简单

1. 在application.properties配置文件中加入如下配置

mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml

2. 定义mapper接口,继承BaseMapper接口,以便于使用mybatis-plus提供的方法

@Repository
public interface UserMapperXml extends BaseMapper<User> {
List<User> list();
}

3. 根据接口生成xml配置文件,IDE一般有辅助的插件,例如IDEA中的Free Mybatis plugin

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zking.mpdemo.mapper.UserMapperXml">
<select id="list" resultType="com.zking.mpdemo.model.User">
select * from user;
</select>
</mapper>

也可以不使用xml配置文件,使用注解来定义sql语句 但是当sql链表等复杂化的时候不方便维护 不推荐

public interface UserMapperXml extends BaseMapper<User> {
@Select("select * from user")
List<User> list();
}

4.测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MpdemoApplication.class)
public class UserMapperXmlTest {
@Autowired
private UserMapperXml userMapperXml;
//使用xml配置的方法
@Test
public void list() {
List<User> list = userMapperXml.list();
list.forEach(t-> System.out.println(t));
}
//mybatis-plus提供的方法
@Test
public void testSelectByID() {
User user = userMapperXml.selectById(2L);
System.out.println(user);
}
}

可以在mybatis-plus中使用mybatis中的功能 但是关于前者的自动维护的功能就会全部失效

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

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

相关文章

SpringCloud_Sleuth分布式链路请求跟踪

目录一、概述1.为什么会出现这个技术&#xff1f;需要解决哪些问题&#xff1f;2.是什么3.解决二、搭建链路监控步骤1.zipkin2.服务提供者3.服务消费者&#xff08;调用方&#xff09;4.依次启动eureka7001/8001/805.打开浏览器访问&#xff1a; http://localhost:9411一、概述…

网络流量监控对DMS系统排错分析案例

背景 DMS系统是某汽车集团的经销商在线系统&#xff0c;是汽车集团的重要业务系统。本次分析重点针对DMS系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及深层网络分析。 该汽车总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和…

Qt扫盲-QDebug理论总结

QDebug理论使用总结一、概述二、使用1. 基础使用2. 格式化选项3.将自定义类型写入流一、概述 每当开发人员需要将调试或跟踪信息写入设备、文件、字符串或控制台时&#xff0c;都会使用QDebug。这个就可以方便我们调试&#xff0c;基本上Qt所有的内容都能通过调试打印出来&…

14.重载运算与类型转换

文章目录重载运算与类型转换14.1基本概念直接调用一个重载的运算符函数某些运算符不应该被重载使用与内置类型一致的含义赋值和复合赋值运算符选择作为成员或者非成员14.2输入和输出运算符14.2.1重载输出运算符<<输出运算符尽量减少格式化操作输入输出运算符必须是非成员…

智能家居之主机---计划筹备

智能家居之主机---计划筹备前言绪言前期构思硬件平台结构平台前言 绪言 感觉有一年多没发过文章了&#xff0c;这一年多太忙了&#xff0c;来到新的公司后要学的太多了&#xff0c;代码风格&#xff0c;架构&#xff0c;操作系统&#xff0c;各种通讯协议&#xff0c;伺服驱动…

解决问题的方法论

概述 解决问题的能力是职场中最重要的能力之一&#xff0c;如何逻辑清晰、效率满满的解决问题&#xff0c;可参考以下4个步骤。 一、准确的界定问题 找出真正的问题。 准确的界定问题&#xff0c;避免被表面现象所迷惑。 《麦肯锡工具》中&#xff0c;给出一个标准的步骤&am…

【数据手册】LM1117L3芯片的使用

1.特征 可调或固定输出1A输出电流低损耗&#xff0c;在1A输出电流时最大电压为1.3V0.04%的线路调节0.2%负载调节100%热极限燃烧快速瞬态响应 2.描述 LM1117系列正可调和固定调节器设计提供1A高电流效率。所有内部电路设计为低至1.3V输入输出差。片内微调将参考电压调整为1% 3…

【微服务】RabbitMQSpringAMQP消息队列

&#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.初识MQ (1) 引入 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;可以立即得到响应&#xff0c;但是你却不能跟多个人同时通话。 异…

leedcode刷题 | 详细注释 | 调用+调试 C++

目录1.两数之和题目C代码2.两数相加题目代码3. 无重复字符的最长子串题目&#xff1a;代码&#xff1a;4. 合并两个有序数组题目&#xff1a;代码&#xff1a;5.寻找两个正序数组的中位数题目&#xff1a;代码&#xff1a;1.两数之和 题目 给定一个整数数组 nums 和一个整数目…

API 网关策略的二三事

作者暴渊&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Committer。 近些年随着云原生和微服务架构的日趋发展&#xff0c;API 网关以流量入口的角色在技术架构中扮演着越来越重要的作用。API 网关主要负责接收所有请求的流量并进行处理转发至上游服务&#xff0c;…

说一说JVM的垃圾回收器

垃圾回收器1.Serial收集器2.parnew收集器3 .parallel Scavenge收集器4.Serial Old5.parallel old收集器6.cms7. G1 收集器串行&#xff1a;指的是垃圾回收器与用户线程交替进行&#xff0c;这意味着在垃圾回收器执行的时候用户线程需要暂停工作 并行&#xff1a;指的是垃圾回收…

网络知识详解之:CA证书制作实战(Nginx数字证书实战)

网络知识详解之&#xff1a;CA证书制作实战 计算机网络相关知识体系详解 网络知识详解之&#xff1a;TCP连接原理详解网络知识详解之&#xff1a;HTTP协议基础网络知识详解之&#xff1a;HTTPS通信原理剖析&#xff08;对称、非对称加密、数字签名、数字证书&#xff09;网络…

Oracle的学习心得和知识总结(九)|Oracle数据库PL/SQL语言条件选择语句之IF和CASE语句技术详解

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Guid…

[Lua实战]整理Lua中忽略的问题

整理Lua中忽略的问题1.元表metatable和元方法1.1元方法_index可以设置为table1.2.元方法_index可以设置为函数1.3.元方法_index和_newindex实现只读table2.Lua强制GC方法2.1 collectgarbage()3.协程和线程的区别3.1协程coroutine.create()是同步执行,不是并行,只是切了一个上下…

Day874.MySQL索引选择出错问题 -MySQL实战

MySQL索引选择出错问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySQL索引选择出错问题的内容。 写 SQL 语句的时候&#xff0c;并没有主动指定使用哪个索引。也就是说&#xff0c;使用哪个索引是由 MySQL 来确定的。 不知道有没有碰到过这种情况&#xff0…

Android开发进阶—invoke反射及其原理解析

反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成成员的信息程序中的对象一般都是在编译时就确定下来,Java反射机制可以动态地创建对象并且…

含有吲哚基团132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;132557-72-3中文名&#xff1a;2,3,3-三甲基-3H-吲哚-5-磺酸&#xff0c;2,3,3-三甲基-3H-吲哚-6-磺酸钾盐英文名&#xff1a;5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0…

Axure原型图设计工具使用记录

Axure原型图设计工具使用记录 Axure快速入门&#xff08;01&#xff09; - 面板介绍 https://blog.51cto.com/u_15294985/3007677 Axure快速入门&#xff08;02&#xff09; - 入门例子&#xff08;登录案例&#xff09; https://developer.aliyun.com/article/1046689 Axu…

03 python 要点(函数+类)

第8章 函数 8.1 定义函数 函数就是执行特定任务的一段代码, 自定义函数的语法格式, 以英文半角冒号结尾. # def: 8.2 调用函数 在定义好函数后&#xff0c;既可调用函数. 8.2.1 使用位置参数调用函数 在调用函数时传递的实参与定义函数时的形参顺序一致&#xff0c;这…

LoongArch上正常使用`pip install`

原创&#xff1a;你在使用loongarch架构操作系统时&#xff0c;是否遇到pip install 安装失败的情况&#xff1f; 刷到这篇文章&#xff0c;大家可添加评论或者私信我&#xff0c;及时满足大家的需求那么&#xff0c;下面讲一下如何配置loongarch架构的pip 仓库及开发原理如何配…