精华内容
下载资源
问答
  • java 物理删除和逻辑删除

    千次阅读 2020-10-17 12:47:09
    java 物理删除和逻辑删除 逻辑删除:文件没有被真正的删除,只不过是文件名的第一个字节被改成操作系统无法识别的字符,通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件恢复出来。 物理删除:...

    java 物理删除和逻辑删除

    逻辑删除:文件没有被真正的删除,只不过是文件名的第一个字节被改成操作系统无法识别的字符,通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件恢复出来。
    物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的
    物理删除是计算机处理数据时的一个概念。 与物理删除相对应的是逻辑删除。逻辑删除就是对要要删除的数据打上一个删除标记,在逻辑上是数据是被删除的,但数据本身依然存在!而物理删除则是把数据从介质上彻底删除掉。

    配置逻辑删除的步骤:

    1. 在配置文件yml中应该配置的信息
    
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-value: 1 # 逻辑已删除值(默认为 1),该具体删除值和数据库中的表数据对应即可
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0),该具体删除值和数据库中的表数据对应即可
    
    1. 添加实体类注解
    @TableLogic
    private Integer delFlag;
    
    1. 对于逻辑删除拦截器bean的注入方式
    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * mybatis-plus配置
     *
     * @author gsl
     */
    @Configuration
    public class MybatisPlusConfig {
    
        /**
         * 在配置文件中注册删除组件
         * @return
         */
        @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }
    }
    
    展开全文
  • java 集合删除数据

    千次阅读 2021-02-12 19:23:11
    public static void main(String[] args) {List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));// 常规删除// list.removeIf(next -> next == 3);Iterator iterator = list.iterator();while (it...

    public static void main(String[] args) {

    List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));

    // 常规删除

    // list.removeIf(next -> next == 3);

    Iterator iterator = list.iterator();

    while (iterator.hasNext()) {

    // Integer next = iterator.next();

    // 当不执行 next时会抛出 异常,原因在于,不允许删除未读的数据,只能删除游标之前的数据

    iterator.remove();

    }

    list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));

    // 这种方式可以删除

    for (int i = 0; i < list.size(); i++) {

    Object o = (Object) list.get(0);

    list.remove(o);

    }

    list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));

    // 这种方式会抛出数组越界异常

    /**

    * 原因在于remove作为重载方法,当数据为数字类型时,是按照索引进行删除

    */

    for (int i = 0; i < list.size(); i++) {

    Integer integer = list.get(i);

    list.remove(integer.intValue());

    }

    list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));

    // 错误方式

    list.forEach(list::remove);

    }

    展开全文
  • Mybatis实现物理删除和逻辑删除。

    千次阅读 2021-03-09 09:24:46
    Mybatis实现物理删除和逻辑删除。 1.首先明白什么是物理删除,什么是逻辑删除? 什么是物理删除呢?就是直接干掉数据库的数据,无法再恢复回来。但在当今的企业级项目中,物理删除已经非常少见,而是使用逻辑删除。...

    Mybatis实现物理删除和逻辑删除。

    教程目录:
    教程一: Mybatis-plus使用教程
    教程二:mybatis-plus的字段自动填充
    教程三:Mybatis实现物理删除和逻辑删除
    教程四:Mybatis-plus实现乐观锁
    教程五:Mybatis-plus实现条件查询

    扫码关注公众号,更多资料尽在掌握。
    在这里插入图片描述

    1.首先明白什么是物理删除,什么是逻辑删除?
    什么是物理删除呢?就是直接干掉数据库的数据,无法再恢复回来。但在当今的企业级项目中,物理删除已经非常少见,而是使用逻辑删除。所谓逻辑删除本质上是个update操作,通过一个标记字段来识别某个数据是否被隐藏起来,但是对于用户来说看不到了自然以为就是删除了。
    我们分别来看看mybatis-plus的物理删除和逻辑删除。

    项目的创建就不详细说明了,我们直接再之前的表上操作。
    我们先来看看物理删除,写一个删除方法吧!
    物理删除方法有几种,我们来看看常用的:
    第一种、deleteById()方法,仅需传入你要删除数据的id即可。注意看控制台,这里执行的是delete语句。真正实现物理删除,数据表中的信息不存在了。
    在这里插入图片描述
    第二种、deleteBatchIds方法,批量删除,也是传入id即可。
    第三种、deleteByMap方法,条件删除。
    这些方法都是物理删除,底层执行的是delete语句。在这里插入图片描述

    逻辑删除:
    所谓逻辑删除本质上是个update操作,通过一个标记字段来识别某个数据是否被隐藏起来,假设在表中设置一个deleted字段,已删除用1表示,未删除用0表示,这样以后在每次查询数据时候,都会添加一个条件 where deleted = 0,这样就永远不会查出delete= 1 的数据了。
    接下来试试看吧!
    第一步、打开数据表,添加一个deleted字段,用来表示逻辑删除位。
    在这里插入图片描述

    我们先看一下表中的数据,所有deleted都是0表示,代表所有数据都在。
    在这里插入图片描述

    第二步、接下来在实体类中,添加该字段,并加上注解@TableLogic,该注解就表示逻辑删除位。

    import com.baomidou.mybatisplus.annotation.*;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import java.util.Date;
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        @TableId(type = IdType.ID_WORKER)
        private Long id;
        private String name;
        private Integer age;
        private String email;
        //create_time
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private  Date updateTime;
        @TableLogic
        private  Integer deleted;
    }
    
    

    在这里插入图片描述

    第三步、我们需要写一个配置类来开启mybatis-plus的逻辑删除。
    MybatisConfig.java

    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MybatisConfig {
        //逻辑删除
        @Bean
        public ISqlInjector iSqlInjector(){
            return new LogicSqlInjector();
        }
    
    }
    
    

    在这里插入图片描述

    到这里逻辑删除配置成功,来测试一下吧。
    我们用deleteById()方法测试。
    在这里插入图片描述

    我们来看看控制台的输出:

    在这里插入图片描述

    看到了吗,现在底层并不在执行delete了,而是执行update语句把delete字段改变下。这样就实现了逻辑删除,

    我们再来看看数据表中数据。
    在这里插入图片描述

    这样逻辑删除就成功了。
    这里你执行一下查询所有方法也不会查到该条数据,因为查询语句后面会跟一个 where delete = 0的条件!

    项目源码:

    github地址

    展开全文
  • 物理删除: 真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据 1、根据 ID 删除记录 //根据ID删除记录(物理删除) @Test public void testDeleteById(){ int result = userMapper.deleteById(1...

    首先看一下数据库中表的数据:



    物理删除:

    真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

    1、根据 ID 删除记录

    //根据ID删除记录(物理删除)
    @Test
    public void testDeleteById(){
        int result = userMapper.deleteById(1L);
        System.out.println(result);
    }

    运行,看数据库中 user 表中 id 为 1 的数据是否被删除

    2、批量删除

    //批量删除(物理删除)
    @Test
    public void testDeleteBatchIds() {
        int result = userMapper.deleteBatchIds(Arrays.asList(2,3));
        System.out.println(result);
    }

    运行,看数据库中 user 表中 id 为 2和3 的数据是否被删除


    逻辑删除:

    假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

     1、向表中添加逻辑删除的字段

    ALTER TABLE `user` ADD COLUMN `deleted` boolean

    此时表结构为: 

    2、向对应的实体类中添加 deleted 属性,并且在该属性上添加 @TableLogic 注解

    //deleted
    @TableLogic//用于逻辑删除
    @TableField(fill = FieldFill.INSERT)//添加这个注解是为了在后面设置初始值,不加也可以
    private Integer deleted;

    3、元对象处理器接口添加 deleted 的 insert 默认值

    package cn.henu.handler;
    
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    @Component//注意在这个类上加@Component注解,或者@Service或者@Repository表示将这个类交给Spring进行管理
    public class MyMetaObjectHandler implements MetaObjectHandler {
        //使用mp实现添加的操作,这个方法就会执行
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime",new Date(),metaObject);
            this.setFieldValByName("updateTime",new Date(),metaObject);
    
            //设置版本号version的初始值为1
            //不加这个也可以,version的默认值为null,加了就是设置version的值从1开始
            this.setFieldValByName("version",1,metaObject);
    
            //添加deleted的初始值为0,也就是默认值
            this.setFieldValByName("deleted", 0, metaObject);
        }
    
        //使用mp实现修改的操作,这个方法就会执行
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    }

    4、配置逻辑删除插件

    package cn.henu.config;
    
    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration//表示将这个类作为配置类
    //@MapperScan("cn.henu.mapper"):在启动时扫描Mapper接口,找到里面的内容
    @MapperScan("cn.henu.mapper")
    public class MpConfig {
        //乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
        //分页插件
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    
        //逻辑删除插件
        @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }
    }

    5、在 application.properties 中添加一个配置(如果删除为1,不删除为0,这一步就可以不用配置)

    #该配置表示删除时为1,不删除时为0
    #也可以不配置这两行,因为默认就是删除为1,不删除为0
    #如果设置删除为111,不删除为000等配置时,就要加上这两行配置
    mybatis-plus.global-config.db-config.logic-delete-value=1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0

    6、先添加一条数据,看其 deleted 字段的值是否为 0

    @Test
    void addUser3(){
        User user = new User();
        user.setName("tainqi");
        user.setAge(20);
        user.setEmail("tianqi@qq.com");
    
        int insert = userMapper.insert(user);
        System.out.println("insert:"+insert);
    }

    7、运行,可以看到数据库中新添加的数据的 deleted 字段的值为 0(将其他数据的deleted字段手动设置为0,标志为未删除状态)

    8、使用上面物理删除的代码执行一下,将刚刚添加的数据删除

    //根据ID删除记录(物理删除)
    @Test
    public void testDeleteById(){
        int result = userMapper.deleteById(1347539342478635010L);
        System.out.println(result);
    }

    9、运行,可以看到,虽然使用的是物理删除的代码,但是数据库中 id 为 1347539342478635010 的记录还存在,只是其 deleted 字段的值由 0 变为了 1,也就是由未删除状态变为删除状态。

    10、再执行查询语句,看刚刚逻辑删除的数据能不能被查询出来

    //查询User表所有数据
    @Test
    void findAll() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }

    运行,看控制台的打印情况:

    可以看到刚刚逻辑删除的那条数据已经查询不到了,但是它并没有真的被删除,只是其 deleted 字段的值由0变为了1

    如果想要查询那条被逻辑删除的数据,就需要自己手动编写SQL语句查询,MybatisPlus没有实现这个查询功能。 

    展开全文
  • Java数据结构与算法入门

    万次阅读 多人点赞 2018-04-29 11:53:50
    第一部分:Java数据结构要理解Java数据结构,必须能清楚何为数据结构?数据结构:Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系。而各数据元素之间的相互关系,又...
  • 对于物理删除和逻辑删除

    千次阅读 2017-10-08 09:47:38
    一般基础数据都是逻辑删除 仅关联关系表使用物理删除.
  • 1、物理删除数据直接清除,减小表的体量,一定程度上有利于查询效率。但是对于重要的数据,误删数据无法恢复。 2、逻辑删除,数据保留,表的体量会不断增加,一定程度上可能影响表操作性能。 但是数据是保留的(数
  • 逻辑删除和物理删除的区别

    千次阅读 2020-11-02 17:02:51
    在逻辑上数据是被删除了,但是数据本身依旧存在库里。 对应的sql语句: update 表名 set is_delete = 1 where id =1; 语句表示,在该表中将id为1的信息进行逻辑删除,那么客户端进行查询id为1的信息, 服务器就不会...
  • Mybatis-Plus中的物理删除与逻辑删除

    千次阅读 2021-03-18 07:57:18
    物理删除 :真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。 逻辑删除 :假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧看到此条记录。 根据id删除记录...
  • 物理删除和逻辑删除的区别

    千次阅读 2019-02-28 14:22:00
    1、“物理删除”是计算机处理数据时的一个概念。与物理删除相对应的是逻辑删除。 2、逻辑删除就是对要要删除的数据打上一个删除标记,在逻辑上是数据是被删除的,但数据本身依然存在!而物理删除则是把数据从介质上...
  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。在我们日常开发...
  • 系统中删除用户,与用户相关的订单就会出错,是一次性把相关订单一起删除呢,还是只做逻辑删除比较好, 一般用哪种呢?
  • 逻辑删除和物理删除

    2018-09-14 17:16:55
    物理删除:真实删除。将对应数据从数据库中删除,之后查询不到此条被删除数据;  Java架构师交流群:781025218, 汇集高水平技术者,营造纯粹的技术交流平台,欢迎真正热爱技术和乐于分享朋...
  • java数据结构与算法之顺序表与链表深入分析

    万次阅读 多人点赞 2016-11-05 16:24:30
    开篇直接奔主题,无论是顺序表还是链表,它们都是...线性表抽象数据类型概述 线性表的顺序存储设计与实现顺序表 1 顺序存储结构的设计原理概要 2 顺序存储结构的实现分析 3 顺序存储结构的效率分析 线性表的链式存
  • Java数据结构之线性表

    千次阅读 2019-04-18 22:19:15
    线性表是其组成元素间具有线性关系的一种线性结构,是由n个数据类型相同的元素构成的有限序列。其具有“一对一”的逻辑关系,与位置有关,除了头尾元素之外,每一个元素都有唯一的前驱元素和后继元素,即元素ai前面...
  • 字典之前设计的时候,做的逻辑删除。现想做物理删除,前提是先判断要删除的字典数据在其他表中未被引用到,如何实现?
  • Java基础:什么是数据结构

    千次阅读 2018-02-27 16:11:38
    一、数据结构1、数据结构的定义 数据结构是计算机存储,组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或存储效率。数据结构...
  • Java基本数据结构

    千次阅读 2019-03-06 21:47:51
    数据结构: 线性表: 最常用的、最简单的数据结构,它是n个数据元素的有限序列、 实现线性表:输出存储线性表元素,即是用一组连续的存储单元,依次存储线性表数据元素,另一种是使用链表存储线性表元素,用一组...
  • 数据结构是数据之间相互存在的一种或多种特定关系元素的集合。 按逻辑结构来划分 集合机构 线性结构 树形结构 图形结构 物理结构 从内存和存储顺序来划分 1.顺序存储结构 2.链式存储结构 根据...
  • Java——数据结构之顺序表

    千次阅读 多人点赞 2021-04-26 22:10:54
    Java——数据结构之顺序表 ...  顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。   顺序表一般可以分为:   静态顺序表:使用
  • Java输入输出数据

    千次阅读 2017-12-15 08:48:51
    目录(?)[+]1什么是IO 2数据流的基本概念 1 数据流2 输入流Input Stream 3 输出流数据流...命令行参数标准输入输出数据流4javaIO层次体系结构 5 非流式文件类–File类 6 JavaIO流类库 io流的四个基本类io流的具体分类
  • Java——数据结构之单链表

    千次阅读 多人点赞 2021-05-15 14:23:08
    文章目录Java——数据结构之单链表1. 链表的概念及结构2.单链表的实现(1)定义一个节点类型(2)头插法(3)尾插法(4)根据下标插入节点(5)查找关键字(6)删除第一次出现的关键字(7)得到单链表的长度(8)...
  • java数据结构有哪些?

    万次阅读 多人点赞 2018-12-28 17:26:11
    Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。 Collection----&gt;Collections Map--...
  • 数据是基础,算法是灵魂 版权声明,本文来自门心叼龙的博客,属于原创内容,转载请注明出处。... 源码下载地址:... 初级篇:Java数据结构与算法初级篇之数组、集合和散列表 中级篇:Ja...
  • Java数据结构----堆的概念及结构

    千次阅读 2019-05-02 16:48:14
    二叉树有两种实现结构,一种是链式结构(详解在上一...堆就是将一个集合的数据按照完全二叉树的顺序结构存储在一个一维数组中,堆在逻辑上是一棵完全二叉树,在物理结构上是一个一维数组. 按照根结点的大小分为大堆(根...
  • 队列是一种先进先出(FIFO)的数据结构,但是有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,在这种情况下使用队列就不行了,比如玩王者的时候突然女朋友一通电话,游戏屏幕...
  • Java常见数据结构面试题(带答案)

    万次阅读 多人点赞 2018-02-13 09:07:09
    1.栈和队列的共同特点是(只允许在端点处插入和删除元素)4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构)5.下列关于栈的叙述正确的是(D) A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出的特征...
  • java开发关于订单如何删除问题

    千次阅读 2018-07-06 17:53:50
    删除订单的时候,可能会包括多个订单项,这样的话就是可能会在删除的时候,有外键约束问题,解决这样的问题,如下:所以:先查询订单,然后去遍历订单,将订单中的多个订单项删除后,再删除订单.controller: /*** * * ...
  • java截取字符串,删除指定内容

    千次阅读 2019-02-14 16:40:57
    在项目中遇到了一个小问题,有语文、数学、英语等9门学科,根据成绩显示不同的学科,每科用顿号隔开。 如:显示成绩高于100的学科; 先判段那些学科高于100 ... wlyx = "物理、";... Java小白,不喜勿喷

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,433
精华内容 43,373
关键字:

java数据的物理删除

java 订阅