精华内容
下载资源
问答
  • Mybatis实现物理删除和逻辑删除。...我们分别来看看mybatis-plus物理删除和逻辑删除。 项目创建就不详细说明了,我们直接再之前表上操作。 我们先来看看物理删除,写一个删除方法吧! 物理删除方法

    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地址

    展开全文
  • oracle公司开发的软件里,经常会遇到类似物理删除和逻辑删除这样一对概念,比如oracle数据库软件、oracle virtual box等。这个应该他们开发软件时的一管理对象的方法。   物理删除,就是在操作系统级别上将如数据...

            oracle公司开发的软件里,经常会遇到类似物理删除和逻辑删除这样一对概念,比如oracle数据库软件、oracle virtual box等。这个应该他们开发软件时的一管理对象的方法。

            物理删除,就是在操作系统级别上将如数据文件给删除了,即这样一个删除操作后,操作系统知道了该数据文件被删除了,但是oracle数据库软件不一定知道该数据文件被删除了,比如,你此时查看V$datafile,被删除的数据文件的记录还在。 oracle数据库软件要如何知道如一个数据文件给删除了呢?这就需要逻辑删除。逻辑删除,就是在oracle数据库软件系统级别上将如一个数据文件给删除了,即这样一个删除操作后,oracle数据库软件系统知道了该数据文件被删除了,具体的说就是,oracle数据库软件有一张上面写有各种存在的可以被oracle数据库软件利用的对象的清单(其实表现形式为一个配置文件),故在oracle数据库软件上执行一条删除命令,实际上,就是在该清单上将该对象的那一条记录删除,这样,oracle数据库软件系统就认为该数据文件被删除了,当然该数据文件此时没有被物理删除。只有当你在操作系统级别上,执行一条删除命令后,操作系统才认为该数据文件被删除了,具体的说就是,操作系统也有一张上面写有各种存在的可以被操作系统利用的对象的清单(其实表现形式为一个配置文件),故在操作系统上执行一条删除命令,实际上,就是在该清单上将该对象的那一条记录删除,并且此时真的将该数据文件删除(即将该数据文件的所占用的空间收回),这样,操作系统就认为该数据文件被删除了。有时候,在oracle数据库软件上执行的有些删除命令,包含操作系统级别的删除命令,这样,在oracle数据库软件上执行这些删除命令后,数据文件,就被同时被物理删除和逻辑删除。

    展开全文
  • 大家好, 我是上白书妖!...我太懒了,不想写,直接截图看讨论过程,总结不是很到位,七张join图知识查询方法,但是删除和更新没考虑到,建表是正常建表不加外键还是加外键也没定论,先这样吧,有定论是我在重...

    大家好, 我是上白书妖!

    知识源于积累,登峰造极源于自律

    今天我根据以前所以学的一些文献,笔记等资料整理出一些小知识点,有不当之处,欢迎各位斧正

    朋友总结的:
    在这里插入图片描述
    关于图片上的网页链接:
    关于数据库 级联,约束,外键 的学习,走过路过,不要错过喽!

    七张Join关联图表:
    上白书妖
    七张Join图的代码

     
    1 A、B两表共有
     select * from tbl_emp a inner join tbl_dept b on a.deptId = b.id;
     
    2 A、B两表共有+A的独有
     select * from tbl_emp a left join tbl_dept b on a.deptId = b.id;
     
    3 A、B两表共有+B的独有
     select * from tbl_emp a right join tbl_dept b on a.deptId = b.id;
     
    4 A的独有 
    select * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null; 
     
    5 B的独有
     select * from tbl_emp a right join tbl_dept b on a.deptId = b.id where a.deptId is null; #B的独有
     
    6 AB全有
    #MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
     #left join + union(可去除重复数据)+ right join
    SELECT * FROM tbl_emp A LEFT JOIN tbl_dept B ON A.deptId = B.id
    UNION
    SELECT * FROM tbl_emp A RIGHT JOIN tbl_dept B ON A.deptId = B.id
     
    7 A的独有+B的独有
    SELECT * FROM tbl_emp A LEFT JOIN tbl_dept B ON A.deptId = B.id WHERE B.`id` IS NULL
    UNION
    SELECT * FROM tbl_emp A RIGHT JOIN tbl_dept B ON A.deptId = B.id WHERE A.`deptId` IS NULL;
    

    总结:
    物理关联 就是设置了级联之后我删除主表而从表自动删除相对应的数据
    逻辑关联 就是我java代码中以硬编码的方式先删除从表再删除主表

    上白书妖结束寄语:
    知识源于积累,登峰造极源于自律

    展开全文
  • 利用SelectBatchIds方法传入List集合 //多值查询 @Test public void testSelectBatch(){ // 通过工具类Array中list集合传入多个参数值 List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2...

    MP查询

    多值查询
    利用SelectBatchIds方法传入List集合

    //多值查询
        @Test
        public void testSelectBatch(){
    //        通过工具类Array中的list集合传入多个参数值
            List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
            System.out.println(users);
            
    
        }
    

    特别注意在sql语句,使用了in作为连接条件

     Preparing: SELECT id,name,age,email,create_time,update_time,version FROM user WHERE id IN ( ? , ? , ? ) 
    ==> Parameters: 1(Integer), 2(Integer), 3(Integer)
    <==    Columns: id, name, age, email, create_time, update_time, version
    <==        Row: 1, zhangsan, 12, 2323231@qq.com, null, null, null
    <==        Row: 2, lisi, 123, 123123@qq.com, null, null, null
    <==      Total: 2
    

    使用map做一个简单的条件组合查询(比较少用)

     //简单条件查询
        @Test
        public void testSelectByC(){
    //        用map构建条件,再用
            Map<String,Object> columnMap=new HashMap<>();
            columnMap.put("name","niuzai");
            columnMap.put("age",12);
            List<User> users = userMapper.selectByMap(columnMap);
            System.out.println(users);
    
    
        }
    

    分页查询

    1. 首先配置分页插件
    //配置分页查询插件
       @Bean
       public PaginationInterceptor paginationInterceptor(){
           return new PaginationInterceptor();
    
       }
    
    1. 编写分页代码,获取分页相关参数,例如当前页数,每页显示几条,或者判断是否存在上下 一页
    /    分页查询
        @Test
        public void  testSelectByPages(){
    //        设置当前页码,每页显示
            Page<User> page=new Page(1,3);
           Page<User> userPage=userMapper.selectPage(page,null);
    //       返回对象得到分页所有数据
            long pages = userPage.getPages();//总页数
            long current = userPage.getCurrent();//当前页数
            List<User> records = userPage.getRecords();//查询数据集合
            long size = userPage.getSize();//每页长度
            long total = userPage.getTotal();//总记录数
            boolean hasNext = userPage.hasNext();//是否存下一页
            boolean hasPrevious = userPage.hasPrevious();//是否存在上一页
    
            System.out.println(pages);
            System.out.println(current);
            System.out.println(records);
            System.out.println(size);
            System.out.println(total);
            System.out.println(hasNext);
            System.out.println(hasPrevious);
    
    
        }
     
    

    删除(物理删除)

    根据id删除或者ids删除多条数据

    /根据id删除
        @Test
        public void testDelectById(){
            int i = userMapper.deleteById(1385609705744887809L);
            System.out.println(i);
        }
    //根据多值删除数据
        @Test
        public void testDelectByBatchId(){
            int i = userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
            System.out.println(i);
        }
    

    根据条件删除

    //根据条件删除
        @Test
        public void testDelectByC(){
            Map<String,Object> columnMap=new HashMap<>();
            columnMap.put("name","niuPP");
    //        获取受影响行数
            int i = userMapper.deleteByMap(columnMap);
            System.out.println(i);
        }
    

    删除(逻辑)

    1. 在数据库中的表添加 deleted 字段作为标识,1 代表删除,0代表未删除
    2. 在实体类中添加该字段,并且注入TableLogic设置插入时,该字段默认为0
    //  通过标识位进行逻辑上删除,配置信息是默认为0为未删除,1为已删除
        @TableLogic
        @TableField(fill = FieldFill.INSERT )
        private Integer deleted;
    
    @Override
        public void insertFill(MetaObject metaObject) {
            //mp执行添加操作时自动填充往create_time字段中添加时间
            this.setFieldValByName("createTime",new Date(),metaObject);
            //添加数据时默认数据版本为1
            this.setFieldValByName("version",1,metaObject);
            this.setFieldValByName("deleted",0,metaObject);
        }
    
    1. 进行测试,发现sql语句写的是更新语句,并且执行逻辑删除后无法查找到deleted为1的数据,则完成逻辑删除
      在这里插入图片描述
    展开全文
  • 删除和删除的处理方法

    千次阅读 2019-08-14 14:48:26
    删除和删除的处理方法硬删除软删除软删除和删除的处理方法 硬删除 硬删除就是传统的物理删除,直接将该记录从数据库中删除。但是是人总会犯错误,在误操作删除了重要数据后,如果想要恢复该数据,需要锁表再去...
  • 物理外键和逻辑外键区别

    千次阅读 2019-07-17 10:20:00
    最近公司打算项目重构,提出了一些问题,其中有一条是关于... 物理外键指是使用foreign key 作为外键关联另一张字段连接方法,而且限定了引擎为InnoDB,而逻辑外键,又叫做事实外键,是因为存在语法上的逻辑...
  • LVM全称为Logical Volume Manager,它是Linux环境下对磁盘分区进行管理一种机制,LVM是建立在硬盘分区之上一个逻辑层,来提高磁盘分区管理灵活性。那么该如何对PV物理卷(硬盘或分区)进行删除呢?一起来看看...
  • 物理外键:是使用foreign key 作为外键关联另一张字段连接方法,而且限定了引擎为InnoDB 逻辑外键:是因为存在语法上的逻辑关联而产生外键,需要有连接关键词inner join 或者left join 等等连接部分。 如何...
  • mybatis-plus实现逻辑删除

    千次阅读 2020-08-20 14:46:08
    逻辑删除就是在数据库中,指定某个状态位字段,约定好删除和删除的状态。例如1是未删除, 0 是删除 。 关于mybatis-plus逻辑删除的官网: mybatis-plus逻辑删除 代码实现 官方文档介绍的使用方法如下。 一共只有两...
  • 我们知道,Maya中接口(Plug)可以包含多...但是我们看到,该类只能遍历读取数组元素,但是没有提供增加或者删除数组元素的方法,那如果要想对数组元素进行增减,这个该如何操作呢? 大家可能都知道 MArrayDataBuilde...
  • 文章目录需求说明代码实现...逻辑删除 就是在数据库中 , 指定某个状态位字段 ,约定好删除和删除的状态. 例如1是未删除, 0 是删除 . 关于mp逻辑删除的官网: mp逻辑删除 代码实现 官方文档介绍的使用方法如下. 一共只
  • 简单来说,删除又可分为逻辑删除和物理删除,普通情况下删除文件、文件夹或者是清空回收站都属于逻辑删除,逻辑删除不会对硬盘数据进行修改,这也意味着被删除的文件是有可能被恢复的;而物理删除时指将硬盘数据彻底...
  • 提供软(逻辑)删除或掩蔽(thrashing)django模型而不是从db中物理删除它们的另一种方法。 楷模 要创建一个不可删除的模型,只需从PermanentModel继承它: class MyModel ( PermanentModel ): pass 它会自动更改...
  • 数据库物理结构分为数据文件临时文件,临时文件数据文件基本相同,只不过是数据文件在逻辑结构上对应着表空间,而临时文件对应着临时表空间而已。它对数据库影响很小,丢失临时文件后果是需要利用临时表空间...
  • 数据库中表必须符合规范,才能杜绝数据冗余、插入异常、删除异常等现象。规范过程是分解表过程。经过分解,同一事物代表属性出现在不同表中。显然,它们应该保持一致。外键值或者是另外一个表主键值...
  • 了解SQL Server 2005数据库的逻辑结构和物理结构。 掌握使用SQL 语句创建和删除数据库。 二. 实验准备 以系统管理员sa身份登录到SQL Server服务器。 了解数据库创建与删除的SQL语句。 三. 实验要求 熟练...
  • 实验报告:数据库创建和删除

    万次阅读 2018-03-24 21:56:28
    了解SQL Server 2017数据库的逻辑结构和物理结构 掌握使用向导方式和SQL方式来创建和删除数据库及数据表的方法 二. 实验内容 ( 设有一学籍管理系统,其数据库名为“EDUC”,初始大小为 10MB,最大为50MB,数据库...
  • 一. 实验目的 1. 熟悉SQL Server 2008 中SQL Server Management Studio的环境 ...2. 了解SQL Server 2008数据库的逻辑结构和物理结构 3. 掌握使用向导方式和SQL方式来创建和删除数据库及数据表的方法 二...
  • 数据分类: 1、物理结构:数据所在内存表现(顺序结构、链式结构... 线性:节点之间存在1:1联系(每一个节点只有一个直接前驱一个直接后驱) 通过物理区来表现线表: 1、顺序线性表 2、链式线性表 树形结...
  • 1. 在courseware表中设置delete_flag字段,在我们删除courseware表中数据时不做物理删除,做逻辑删除; 尽管数据会积累,但是相对来需要被删除的数据占少数;或者在下次操作时可以校验是否是已删除的数据,可以...
  • Unity3d5.1简单配置及粒子效果的删除

    千次阅读 2015-08-11 14:45:31
    因为工作需要,跑过来学习unity3d了...全程代码量少可怜,从获取键盘鼠标输入,到物理引擎各种方法和回调,全部都有封装好了函数给你使用,只需要拖拖拉拉就把对象赋值绑定,碰撞检测更是方便,逻辑上也没有cocos
  • 数据恢复软件,一般用...例如打开逻辑磁盘CreateFile+"\\.\C:"即可打开C盘,CreateFile+"\\.\PhysicalDrive0"可打开0号物理磁盘,也就是第1个磁盘,通常是系统先加载那个磁盘,打开后,即可用ReadFileWriteFi...
  • 本文实例讲述了JS实现线性表的顺序表示方法。分享给大家供大家参考,具体如下: 线性表的顺序表示指的是用一组地址连接的存储单元依次存储线性表的数据元素。...下面我们来实现插入和删除的过程 首先是插入
  • 刚好,oracle提供了一些强大的方法或机制,可以让你找到“后悔药”。根据oracle数据库的特点提供的工具,主要方法有以下几种方法: 利用逻辑备份使用import工具丢失数据的表 利用物理备份来通过还原数据文件并进行...
  • 所以这里需要介绍一下链式存储结构,由于它不要求逻辑上相邻元素在物理位置上也相邻,所以它没有顺序存储结构弱点,但是也没有顺序表可随机存取优点。 下面介绍一下什么是链表。 线性表链式存储结构用一组...
  • 顺序线性表优点:方便存取(随机),特点是物理位置和逻辑为主都是连续(相邻)。但是也有不足,比如;前面插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 ...故链表的逻辑顺序和物理顺序...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 359
精华内容 143
关键字:

逻辑删除和物理删除的方法