• MyBatisPlus-多记录操作及逻辑删除


    目录

    一、多记录操作

    二、逻辑删除


    一、多记录操作

    我们之前添加了很多商品在购物车上,如果不想要了,就要删除,一个一个删除比较慢还比较费事,所以会给用户一个批量操作,也就是一个复选框,用户一次可以勾选多个也可以进行全选,然后删除一次就可以将购物车清空,这就需要用到批量删除的操作。

    实现多条删除,对应的API方法:

    int deleteBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList);

    删除(根据ID批量删除),参数是一个集合,可以存放多个id值。

    需求:根据传入的id集合将数据库表中的数据删除掉

    1. @SpringBootTest
    2. class Mybatisplus03DqlApplicationTests {
    3. @Autowired
    4. private UserDao userDao;
    5. @Test
    6. void testDelete(){
    7. //删除指定多条数据
    8. List list = new ArrayList<>();
    9. list.add(1402551342481838081L);
    10. list.add(1402553134049501186L);
    11. list.add(1402553619611430913L);
    12. userDao.deleteBatchIds(list);
    13. }
    14. }

    执行成功后,数据库表中的数据就会按照指定的id进行删除。

    除了按照id集合进行批量删除,也可以按照id集合进行批量查询,对应API是:

    List<T> selectBatchIds(@Param(Constants.COLLECTION) CollectionSerializable> idList);

    查询(根据ID 批量删除),参数是一个集合,可以存放多个id的值。

    需求:根据传入的ID集合查询用户信息

    1. @SpringBootTest
    2. class Mybatisplus03DqlApplicationTests {
    3. @Autowired
    4. private UserDao userDao;
    5. @Test
    6. void testGetByIds(){
    7. //查询指定多条数据
    8. List list = new ArrayList<>();
    9. list.add(1L);
    10. list.add(3L);
    11. list.add(4L);
    12. userDao.selectBatchIds(list);
    13. }
    14. }

    查询结果会按照指定传入的id的值进行查询。

    二、逻辑删除

    在删除表中数据时,有时会有主外键的关系,如果删除了一条数据,对应其他表的有主外键关系对应的数据也会删除

    对应删除操作业务问题:

    物理删除:业务数据在数据库中丢失,执行的是delete操作

    逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中,执行的update操作

    1、修改数据表添加deleted列

    字段名可以任意,内容可以自定义,比如0表示正常,1表示删除,可以在添加列的同时设置其默认值为0正常

    2、实体类添加属性

    1. @Data
    2. //@TableName("tbl_user") 可以不写是因为配置了全局配置
    3. public class User {
    4. @TableId(type = IdType.ASSIGN_UUID)
    5. private String id;
    6. private String name;
    7. @TableField(value="pwd",select=false)
    8. private String password;
    9. private Integer age;
    10. private String tel;
    11. @TableField(exist=false)
    12. private Integer online;
    13. @TableLogic(value="0",delval="1")
    14. //value为正常数据的值,delval为删除数据的值
    15. private Integer deleted;
    16. }

    3、运行删除方法

    1. @SpringBootTest
    2. class Mybatisplus03DqlApplicationTests {
    3. @Autowired
    4. private UserDao userDao;
    5. @Test
    6. void testDelete(){
    7. userDao.deleteById(1L);
    8. }
    9. }

    逻辑删除走的是update操作,会将指定的字段修改成删除状态对应的值。

    说明:

    1、逻辑删除MP会将所有的查询都添加一个为删除的条件,也就是已经别删除的数据是不应该被查询出来的。如果还想把已经删除的数据都查询出来,就需要如下操作:

    1. @Mapper
    2. public interface UserDao extends BaseMapper {
    3. //查询所有数据包含已经被删除的数据
    4. @Select("select * from tbl_user")
    5. public List selectAll();
    6. }

    2、如果每个表都有逻辑删除,不需要再每个模型类的属性上添加@TableLogic注解,可以在配置文件中添加全局配置,如下:

    1. mybatis-plus:
    2. global-config:
    3. db-config:
    4. # 逻辑删除字段名
    5. logic-delete-field: deleted
    6. # 逻辑删除字面值:未删除为0
    7. logic-not-delete-value: 0
    8. # 逻辑删除字面值:删除为1
    9. logic-delete-value: 1

    逻辑删除的本质是:修改操作,如果加了逻辑删除字段,查询数据时也会自动带上逻辑删除字段。

    执行的SQL语句为:

    UPDATE tbl_user SET deleted=1 where id = ? AND deleted=0
    名称@TableLogic
    类型属性注解
    位置模型类中用于表示删除字段的属性定义上方
    作用标识该字段为进行逻辑删除的字段
    相关属性

    value:逻辑未删除值

    delval:逻辑删除值

  • 相关阅读:
    简单选择排序
    【Python】Python 中的Docutils模块详解
    2023年全国研究生数学建模竞赛华为杯C题大规模创新类竞赛评审方案研究
    Python爬取代理IP
    VScode+ArduinoCLI环境搭建
    Go语言的IO库那么多纠结该如何选择
    Python应用—车辆统计(Opencv)
    RT Preempt linux学习笔记
    配置cri-docker使kubernetes1.24以docker作为运行时
    Java项目:ssm学生学籍管理系统
  • 原文地址:https://blog.csdn.net/m0_61961937/article/details/126067453