IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MyBatisPlus之逻辑删除 -> 正文阅读

[大数据]MyBatisPlus之逻辑删除

会当凌绝顶,一览众山小

| @Author:TTODS

MyBatisPlus框架系列文章目录:


前言

逻辑删除是指使用一个特殊的字段来表示数据库表中的一条记录是否被删除了(或是否存在).

例如为数据库表中的每一条记录都增加一个is_delete字段,当is_delete为1时,表示该记录已经被删除了,当is_delete为0时,表示该字段还有效.

与逻辑删除相对的就是物理删除,指直接从数据库中删除记录.

本文介绍了如何使用MybatisPlus实现逻辑删除功能.

新建一个简单的测试表tag

CREATE TABLE `tag`  (
  `id` int(11) AUTO_INCREMENT NOT NULL,
  `name` varchar(255),
  `is_delete` tinyint(1) default 0,
    PRIMARY KEY (`id`)
);

该表包括三个字段:

  1. id 编号
  2. name 名称
  3. is_delete 删除标志

然后预先在表中插入一些用于测试的数据

INSERT INTO `tag` VALUES (1, '标签1', 0);
INSERT INTO `tag` VALUES (2, '标签2', 0);
INSERT INTO `tag` VALUES (3, '标签3', 0);
INSERT INTO `tag` VALUES (4, '标签4', 0);
INSERT INTO `tag` VALUES (5, '标签5', 0);
INSERT INTO `tag` VALUES (6, '标签6', 0);
INSERT INTO `tag` VALUES (7, '标签7', 0);
INSERT INTO `tag` VALUES (8, '标签8', 0);
INSERT INTO `tag` VALUES (9, '标签9', 0);
INSERT INTO `tag` VALUES (10, '标签10', 0);
INSERT INTO `tag` VALUES (11, '标签11', 0);
INSERT INTO `tag` VALUES (12, '标签12', 0);
INSERT INTO `tag` VALUES (13, '标签13', 0);
INSERT INTO `tag` VALUES (14, '标签14', 0);
INSERT INTO `tag` VALUES (15, '标签15', 0);
INSERT INTO `tag` VALUES (16, '标签16', 0);
INSERT INTO `tag` VALUES (17, '标签17', 0);
INSERT INTO `tag` VALUES (18, '标签18', 0);
INSERT INTO `tag` VALUES (19, '标签19', 0);
INSERT INTO `tag` VALUES (20, '标签20', 0);

操作完成后tag表如下:
在这里插入图片描述

编写实体类Tag

package com.example.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;

@Data
public class Tag {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    // @TableLogic 用来标注表示逻辑删除的字段 value是表示未删除的值 delval是表示删除的值
    @TableLogic(value = "0",delval = "1")
    private Integer isDelete;
}

@TableLogic 用来标注表示逻辑删除的字段, value是表示未删除的值 ,delval是表示删除的值.

编写TagMapper

package com.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.pojo.Tag;

public interface TagMapper extends BaseMapper<Tag> {
}

编写测试类进行测试

package com.example;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import com.example.mapper.TagMapper;
import com.example.pojo.Tag;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class LogicDeleteTests {
    @Resource
    TagMapper mapper;
    
}

测试删除
@Test
public void testDelete() {
    // 删除 id 为 1,2,5的记录
    mapper.deleteBatchIds(Arrays.asList(1,2,5));
}

生成的sql代码:

==>  Preparing: UPDATE tag SET is_delete=1 WHERE id IN ( ? , ? , ? ) AND is_delete=0
==> Parameters: 1(Integer), 2(Integer), 5(Integer)
<==    Updates: 3

mybatis-plus并没有执行delete语句,而是使用了update语句将对应记录的is_delete字段改为了1.

测试查询
@Test
public void testSelect(){
    // 查询id小于10的记录
    QueryWrapper<Tag> wrapper = new QueryWrapper<Tag>().lt("id", 10);
    List<Tag> tags = mapper.selectList(wrapper);
    tags.forEach(System.out::println);
}

生成的sql代码及程序输出:

==>  Preparing: SELECT id,name,is_delete FROM tag WHERE is_delete=0 AND (id < ?)
==> Parameters: 10(Integer)
<==      Total: 6
Tag(id=3, name=标签3, isDelete=0)
Tag(id=4, name=标签4, isDelete=0)
Tag(id=6, name=标签6, isDelete=0)
Tag(id=7, name=标签7, isDelete=0)
Tag(id=8, name=标签8, isDelete=0)
Tag(id=9, name=标签9, isDelete=0)

mybatis-plus在select语句后自动拼接了WHERE is_delete=0以免查出已删除的记录.

测试更新
@Test
public void testUpdate(){
    // 将 id小于11的标签名 改为原来的名字拼接上'<update>'
    UpdateChainWrapper<Tag> updateChain = new UpdateChainWrapper<>(mapper);
    updateChain.setSql("`name`=concat(`name`,'<update>')").lt("id",11).update();
}

生成的sql代码:

==>  Preparing: UPDATE tag SET `name`=concat(`name`,'<update>') WHERE is_delete=0 AND (id < ?)
==> Parameters: 11(Integer)
<==    Updates: 7

类似于查询语句,mybatis-plus在update语句后自动拼接了WHERE is_delete=0以免更新已删除的记录.

测试插入
@Test
public void testInsert(){
    Tag tag = new Tag();
    tag.setName("标签21");
    mapper.insert(tag);
}

生成的sql语句

==>  Preparing: INSERT INTO tag ( name ) VALUES ( ? )
==> Parameters: 标签21(String)
<==    Updates: 1

mybatis-plus并不会在insert语句中,将is_delete设为0,不过我们可以在数据库中为该字段设置默认值.

在Mybatis-plus配置项中配置逻辑删除

在application.yml配置文件中配置逻辑删除,就不需要在每个实体类中都使用@TableLogic注解了

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDelete
      logic-delete-value: 1
      logic-not-delete-value: 0

上一篇:MyBatisPlus之字段填充
下一篇:MyBatisPlus之乐观锁

- THE END -
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:16:31  更:2021-10-26 12:19:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:01:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码