天天看点

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

目录

​​一、多记录操作​​

​​二、逻辑删除​​

一、多记录操作

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

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

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

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

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

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

@SpringBootTest 
class Mybatisplus03DqlApplicationTests { 

    @Autowired 
    private UserDao userDao;
    
    @Test 
    void testDelete(){ 
        //删除指定多条数据 
        List<Long> list = new ArrayList<>(); 
        list.add(1402551342481838081L); 
        list.add(1402553134049501186L); 
        list.add(1402553619611430913L); 
        userDao.deleteBatchIds(list); 
    } 
}      

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

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

List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);      

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

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

@SpringBootTest 
class Mybatisplus03DqlApplicationTests { 

    @Autowired 
    private UserDao userDao; 

    @Test 
    void testGetByIds(){ 
        //查询指定多条数据 
        List<Long> list = new ArrayList<>(); 
        list.add(1L); 
        list.add(3L); 
        list.add(4L); 
        userDao.selectBatchIds(list); 
    } 
}      

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

二、逻辑删除

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

对应删除操作业务问题:

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

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

1、修改数据表添加deleted列

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

2、实体类添加属性

@Data 
//@TableName("tbl_user") 可以不写是因为配置了全局配置 
public class User {

    @TableId(type = IdType.ASSIGN_UUID) 
    private String id; 
    private String name; 
    @TableField(value="pwd",select=false) 
    private String password; 
    private Integer age; 
    private String tel; 
    @TableField(exist=false) 
    private Integer online; 
    @TableLogic(value="0",delval="1") 
    //value为正常数据的值,delval为删除数据的值 
    private Integer deleted; 
}      

3、运行删除方法

@SpringBootTest 
class Mybatisplus03DqlApplicationTests { 

    @Autowired 
    private UserDao userDao; 

    @Test 
    void testDelete(){ 
        userDao.deleteById(1L); 
    } 
}      

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

说明:

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

@Mapper 
public interface UserDao extends BaseMapper<User> {
    //查询所有数据包含已经被删除的数据 
    @Select("select * from tbl_user") 
    public List<User> selectAll(); 
}      

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

mybatis-plus: 
    global-config: 
        db-config: 
            # 逻辑删除字段名 
            logic-delete-field: deleted 
            # 逻辑删除字面值:未删除为0 
            logic-not-delete-value: 0 
            # 逻辑删除字面值:删除为1 
            logic-delete-value: 1      
逻辑删除的本质是:修改操作,如果加了逻辑删除字段,查询数据时也会自动带上逻辑删除字段。

执行的SQL语句为:

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