[MyBatisPlus]DML编程控制①(多记录操作、逻辑删除)

网友投稿 287 2022-09-05

[MyBatisPlus]DML编程控制①(多记录操作、逻辑删除)

文章目录

​​多记录操作​​​​逻辑删除​​

​​问题引入​​​​实现步骤​​

​​步骤1:修改数据库表添加`deleted`列​​​​步骤2:实体类添加属性​​​​步骤3:运行删除方法​​

​​知识点:@TableLogic​​

多记录操作

先来看下问题:

之前添加了很多商品到购物车,过了几天发现这些东西又不想要了,该怎么办呢?

很简单删除掉,但是一个个删除的话还是比较慢和费事的,所以一般会给用户一个批量操作,也就是前面有一个复选框,用户一次可以勾选多个也可以进行全选,然后删一次就可以将购物车清空,这个就需要用到​​批量删除​​的操作了。

具体该如何实现多条删除,我们找找对应的API方法

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

翻译方法的字面意思为:删除(根据ID 批量删除),参数是一个集合,可以存放多个id值。

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

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

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

除了按照id集合进行批量删除,也可以按照id集合进行批量查询,还是先来看下API

List selectBatchIds(@Param(Constants.COLLECTION) Collection idList);

方法名称翻译为:查询(根据ID 批量查询),参数是一个集合,可以存放多个id值。

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

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

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

逻辑删除

问题引入

先来分析下问题:

所以对于删除操作业务问题来说有:

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

MP中逻辑删除具体该如何实现?

实现步骤

步骤1:修改数据库表添加​​deleted​​列

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

步骤2:实体类添加属性

(1)添加与数据库表的列对应的一个属性名,名称可以任意,如果和数据表列名对不上,可以使用@TableField进行关系映射,如果一致,则会自动对应。

(2)标识新增的字段为逻辑删除字段,使用​​@TableLogic​​

@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:运行删除方法

@SpringBootTestclass Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testDelete(){ userDao.deleteById(1L); }}

从测试结果来看,逻辑删除最后走的是update操作,会将指定的字段修改成删除状态对应的值。

思考

逻辑删除,对查询有没有影响呢?

执行查询操作

@SpringBootTestclass Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testFind(){ System.out.println(userDao.selectList(null)); }}

运行测试,会发现打印出来的sql语句中会多一个查询条件,如:

可想而知,MP的逻辑删除会将所有的查询都添加一个未被删除的条件,也就是已经被删除的数据是不应该被查询出来的。

如果还是想把已经删除的数据都查询出来该如何实现呢?

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

如果每个表都要有逻辑删除,那么就需要在每个模型类的属性上添加​​@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

名称

@TableLogic

类型

属性注解

位置

模型类中用于表示删除字段的属性定义上方

作用

标识该字段为进行逻辑删除的字段

相关属性

value:逻辑未删除值

delval:逻辑删除值

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:营销头条:吴亦凡有点烦,更烦的是这些品牌!
下一篇:[Maven进阶]属性与版本管理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~