一、多记录操作
我们之前添加了很多商品在购物车上,如果不想要了,就要删除,一个一个删除比较慢还比较费事,所以会给用户一个批量操作,也就是一个复选框,用户一次可以勾选多个也可以进行全选,然后删除一次就可以将购物车清空,这就需要用到批量删除的操作。
实现多条删除,对应的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 |
类型 | 属性注解 |
位置 | 模型类中用于表示删除字段的属性定义上方 |
作用 | 标识该字段为进行逻辑删除的字段 |
相关属性 | value:逻辑未删除值 delval:逻辑删除值 |