mybatis-plus2

news2024/9/28 15:32:30

目录

一、乐观锁

二、乐观锁与悲观锁的区别

1.乐观锁和悲观锁的应用场景

三、条件查询构造器

四、分页查询

五、逻辑删除

六、在Mybatis-plus中使用xml配置


一、乐观锁

乐观锁插件 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/0d93c0/

当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式(来自官方文档):

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败

配置示例:

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

2.修改实体类,在使用类中加入对应的version字段,并使用是乐观锁

//乐观锁
@Version
private Integer version;

3.配置乐观锁

package com.jwj.mplus.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
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());
        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);
}

效果如下图所示:

二、乐观锁与悲观锁的区别

图解悲观锁和乐观锁 - 知乎这篇文章讲什么这是一篇介绍悲观锁和乐观锁的入门文章。旨在让那些不了解悲观锁和乐观锁的小白们弄清楚什么是悲观锁,什么是乐观锁。不同于其他文章,本文会配上相应的图解让大家更容易理解。通过该文,你会学习到…https://zhuanlan.zhihu.com/p/63714157

1.乐观锁和悲观锁的应用场景

  1. 悲观锁
    因为悲观锁会影响系统吞吐的性能,所以适合应用在为居多的场景下。
  2. 乐观锁
    因为乐观锁就是为了避免悲观锁的弊端出现的,所以适合应用在为居多的场景下。

解释:乐观锁:是所保护的数据绝大多数情况下是安全的。

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

三、条件查询构造器

https://baomidou.com/pages/10c804/#abstractwrappericon-default.png?t=MBR7https://baomidou.com/pages/10c804/#abstractwrapper1.批量查询多个对象

  @Test
    public void testSelectList() {
//一次查询多个ID
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
        users.forEach(t -> {
            System.out.println(t);
        });
    }
    @Test
    public void testSelectByMap() {
//使用map进行查询
        Map<String, Object> map = new HashMap<>();
        map.put("name", "Tom");
        map.put("age", 28);
        List<User> users = userMapper.selectByMap(map);
        users.forEach(t-> System.out.println(t));
    }


@Test
    public void testWrapperLike(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.likeRight("name","T")
                .eq("age",28).apply(" 1=1 ");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(t-> System.out.println(t));
    }
    @Test
    public void testUpdateWrapper(){
        UpdateWrapper u = new UpdateWrapper();
//        u.set("name","TT");
        u.eq(true,"id",6L);
        User user = userMapper.selectById(6L);
//        user = new User();
        user.setName("TTT");
        userMapper.update(user,u);
    }

四、分页查询

分页插件 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/97710a/#paginationinnerinterceptor1.分页配置

package com.jwj.mplus.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;

@Configuration
public class MybatisPlusConfig {

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

 2.分页演示

@Test
    public void testSelectPage() {
        PageDTO<User> page = new PageDTO<>();
//        当前页第3页
        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));
    }

五、逻辑删除

逻辑删除 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/6b03c5/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95物理删除使用起来比较简单,仿照查询功能即可,不再赘述。

什么是逻辑删除?

即:标记删除,并不是真的从数据库中删除,而是做个删除标记,在查询时,过滤掉标记为删除的记录即可。

1.数据库表结构调整

 2.修改实体类

 //标记该字段为逻辑删除字段
    @TableLogic
    private Integer deleted;

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

#逻辑删除字段名
mybatis-plus.global-config.db-config.logic-delete-field=deleted
# 1表示逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
# 0 表示未删除
mybatis-plus.global-config.db-config.logic-not-delete-value=0

4.测试

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

效果如下图所示:

它在数据库是还在的,查询不出来的。

六、在Mybatis-plus中使用xml配置

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

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

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

2.定义mapper接口

package com.jwj.mplus.config;

import com.jwj.mplus.model.User;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 敢敢
 * @site www.javajwj.com
 * @company xxx公司
 * @create  2023-01-30 19:42
 */
@Repository
public interface UserMapperXml {
    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.jwj.mplus.config.UserMapperXml">
    <select id="list" resultType="com.jwj.mplus.model.User">
select * from user;
</select>
</mapper>

4.测试

package com.jwj.mplus;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.jwj.mplus.config.UserMapperXml;
import com.jwj.mplus.mapper.UserMapper;
import com.jwj.mplus.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
public class SampleTest2 {

    @Autowired
    private UserMapperXml userMapperXml;

    @Test
    public void test1(){
        List<User> list = userMapperXml.list();
        list.forEach(System.out::println);
    }

}

也可以不使用xml配置,使用注解来定义sql语句

package com.jwj.mplus.config;

import com.jwj.mplus.model.User;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 敢敢
 * @site www.javajwj.com
 * @company xxx公司
 * @create  2023-01-30 19:42
 */
@Repository
public interface UserMapperXml {

    @Select("select * from user")
    List<User> list();
}

一般来说公司不会用,连表就不行了,但有的公司会用,很少。

连表的话是不好调优的,所以不推荐。

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

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

相关文章

16. JSON解析

1. 什么是 JSON &#xff1f; JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;。 JSON 是轻量级的文本数据交换格式。 JSON 独立于语言&#xff1a;JSON 使用 Javascript语法来描述数据对象&#xff0c;但是 JSON 仍然独立于语言和平台…

Kettle基础操作

目录 Kettle基础操作 1 启动Kettle 2 创建本地资源库 3 基础操作 3.1 新建转换 3.2 新建作业 3.3 节点连接 4 导入/导出资源库 5 创建数据库连链接 Kettle基础操作 1 启动Kettle 前置环境&#xff1a;JDK 1.7以上、IE浏览器升级至IE10以上&#xff08;Kettle7.0以下…

Java——打家劫舍

题目链接 leetcode在线oj题——打家劫舍 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff…

Hive数仓建设手册

1 数仓的分层及建模理论 1.1 数据仓库的用途 整合公司所有业务数据&#xff0c;建立统一的数据中心产生业务报表&#xff0c;用于作出决策为网站运营提供运营上的数据支持可以作为各个业务的数据源&#xff0c;形成业务数据互相反馈的良性循环分析用户行为数据&#xff0c;通…

MySQL中的正则表达式

目录 一.介绍 二.格式 三.操作 一.介绍 正则表达式(regular expression)描述了一种字符串匹配的规则&#xff0c;正则表达式本身就是一个字符串&#xff0c;使用这个字符串来描述、用来定义匹配规则&#xff0c;匹配一系列符合某个句法规则的字符串。在开发中&#xff0c;正…

5G小区选择重选参数的设置

学习大唐杯的过程中的一些总结。 目录 前言 一、S准则 二、R准则 三、关于频点优先级 总结 前言 5G参数总体的设计思想是在总体成本的控制下&#xff0c;满足覆盖范围和容量的同时&#xff0c;达到5G各个小区之间正确进行通信。 一、S准则 在后续介绍的频点优先级中&#xff0…

【多任务】任务损失/梯度优化策略合集

本文分享如何从loss和gradient方面,优化多任务模型,缓解负迁移或跷跷板的问题。不足之处,还望批评指正。 背景 最近工作中,有使用到多任务模型,但实际使用时,会面临负迁移、跷跷板等现象。 除了从模型角度优化,这里介绍从loss和gradient方面的优化

SpringBoot创建接口

目录 一、创建Spring Boot Project (一)配置Spring Boot (二)配置数据库连接&#xff0c;并启动tomcat 二、新建测试网页——这一步可以忽略&#xff0c;主要是测试配置是否成功 1.新建一个页面 2.创建TestController类 3.启动SpringbootpracticeApplication类——sprin…

【Linux】makemakefile

【Linux】make & makefile 文章目录【Linux】make & makefile1、makefile文件2、make命令3、make原理规则4、.PHONY5、编译与否的判断法1、makefile文件 makefile实际上是一个文件&#xff0c;配置文件 充当Linux上的工程管理工具&#xff0c;可以实现自动化编译 mak…

transformer库的思想

transformer库建立思路 (1) Model类: 如BertModel , 目前收录有超过30个PyTorch模型或Keras模型; (2) Configuration类: 如BertConfig , 用于存储搭建模型的参数; (3) Tokenizer类: 如BertTokenizer , 用于存储分词词汇表以及编码方式; 使用from_pretrained()和save_pretraine…

区块链知识系列 - 系统学习EVM(二)

特点 EVM出于所谓运算速度和效率方面考虑&#xff0c;采用了非主流的256bit整数。不支持浮点数缺乏标准库支持,例如字符串拼接、切割、查找等等都需要开发者自己实现给合约打补丁或是部分升级合约代码在EVM中是完全不可能的 存储 Code code 部署合约时储存 data 字段也就是合…

08-linux网络管理-iptables扩展模块

文章目录1. 概述2. icmp 模块2.1 示例&#xff08;禁止本机ping其它主机&#xff09;2.2 示例&#xff08;其他主机ping本机&#xff09;2.3 --icmp-type 说明3. iprange模块4. multiport 模块5. state 模块5.1 语法5.2 完整示例6. limit模块6.1 语法6.2 完整示例7. connlimit7…

[2019红帽杯]easyRE1题解

迷蒙马背眠&#xff0c;月随残梦天边远&#xff0c;淡淡起茶烟。 ——松尾芭蕉 目录 1.查壳 2.拖入64位IDA&#xff0c;找到主函数 3.静态分析主函数 4.wp 1.查壳 ELF文件&#xff0c;64bit 2.拖入64位IDA&#xff0c;找到主函数 没有标明main函数&#xff0c;我们打开str…

OSCP_VULHUB COVFEFE: 1

文章目录前言信息收集渗透过程权限提升前言 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/covfefe-1,199/ 攻击机&#xff1a;kali&#xff08;192.168.132.139&#xff09; 靶机&#xff1a;covfefe&#xff08;192.168.132.146&#xff09; 下载好靶机之后直接使…

vivo 超大规模消息中间件实践之路

作者&#xff1a;vivo 互联网存储技术团队-Luo Mingbo、中间件团队- Liu Runyun 本文根据“2022 vivo开发者大会"现场演讲内容整理而成。 本文主要介绍超大数据规模场景下分布式消息中间件在vivo的应用实践。 在线业务侧主要从RocketMQ集群部署架构、平台系统架构、日常运…

EMC基础:电容的频率特性

本文将对其中使用电容和电感降噪的对策进行介绍&#xff0c;这也可以称为“噪声对策的基础”。在这里使用简单的四元件模型。如果要进一步表达高频谐振时&#xff0c;可能需要更多的元件模型。 电容的频率特性 探讨利用电容器来降低噪声时&#xff0c;充分了解电容器的特性是…

设计模式——软件设计原则

目录 3.软件设计原则 3.1 开闭原则 3.2 里氏代换原则 3.3 依赖倒转原则 3.4 接口隔离原则 3.5 迪米特法则 3.6 合成复用原则 3.软件设计原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要…

8、Servlet——Servlet生命周期、Servlet特性

目录 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 1.2 初始化 1.3 服务 1.4 销毁 2、Servlet执行流程 3、代码演示 二、 Servlet特性 1、线程安全问题 2、如何保证线程安全 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 当用户第一次访问Ser…

flutter裁剪三角形,并设置三角形最长边阴影(类似钉钉登录页右上角图标样式)

需求 需要使用flutter创建类似钉钉登录页右上角图表样式 过程 图标 图标直接从阿里巴巴图标库中下载png文件&#xff0c;并设置相应颜色 三角形阴影 样式的主要难点在三角形及三角形阴影这里 1、三角形的裁剪有两种方法&#xff1a; 第一种是 使用边框实现三角形 参考博客…

springboot自动加载--自定义启动器

创建自定义启动器 0、项目总览 1、创建项目&#xff0c;引入依赖 创建项目 spring-boot-jdbc-starter&#xff0c;引入依赖&#xff0c;pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apa…