会当凌绝顶,一览众山小
| @Author:TTODS
MyBatisPlus框架系列文章目录:-
Springboot整合MybatisPlus
-
MyBatisPlus Mapper层的CRUD
-
MyBatisPlus Service层的CRUD
-
MyBatisPlus提供的分页功能
-
MyBatisPlus之字段填充
-
MyBatisPlus之逻辑删除(当前)
-
MyBatisPlus之乐观锁
-
[MyBatisPlus之代码生成器(近期发布)]
前言
逻辑删除是指使用一个特殊的字段来表示数据库表中的一条记录是否被删除了(或是否存在).
例如为数据库表中的每一条记录都增加一个is_delete字段,当is_delete为1时,表示该记录已经被删除了,当is_delete为0时,表示该字段还有效.
与逻辑删除相对的就是物理删除,指直接从数据库中删除记录.
本文介绍了如何使用MybatisPlus实现逻辑删除功能.
新建一个简单的测试表tagCREATE TABLE `tag` (
`id` int(11) AUTO_INCREMENT NOT NULL,
`name` varchar(255),
`is_delete` tinyint(1) default 0,
PRIMARY KEY (`id`)
);
该表包括三个字段:
- id 编号
- name 名称
- is_delete 删除标志
然后预先在表中插入一些用于测试的数据
INSERT INTO `tag` VALUES (1, '标签1', 0); INSERT INTO `tag` VALUES (2, '标签2', 0); INSERT INTO `tag` VALUES (3, '标签3', 0); INSERT INTO `tag` VALUES (4, '标签4', 0); INSERT INTO `tag` VALUES (5, '标签5', 0); INSERT INTO `tag` VALUES (6, '标签6', 0); INSERT INTO `tag` VALUES (7, '标签7', 0); INSERT INTO `tag` VALUES (8, '标签8', 0); INSERT INTO `tag` VALUES (9, '标签9', 0); INSERT INTO `tag` VALUES (10, '标签10', 0); INSERT INTO `tag` VALUES (11, '标签11', 0); INSERT INTO `tag` VALUES (12, '标签12', 0); INSERT INTO `tag` VALUES (13, '标签13', 0); INSERT INTO `tag` VALUES (14, '标签14', 0); INSERT INTO `tag` VALUES (15, '标签15', 0); INSERT INTO `tag` VALUES (16, '标签16', 0); INSERT INTO `tag` VALUES (17, '标签17', 0); INSERT INTO `tag` VALUES (18, '标签18', 0); INSERT INTO `tag` VALUES (19, '标签19', 0); INSERT INTO `tag` VALUES (20, '标签20', 0);
操作完成后tag表如下:
package com.example.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
@Data
public class Tag {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
// @TableLogic 用来标注表示逻辑删除的字段 value是表示未删除的值 delval是表示删除的值
@TableLogic(value = "0",delval = "1")
private Integer isDelete;
}
@TableLogic 用来标注表示逻辑删除的字段, value是表示未删除的值 ,delval是表示删除的值.
编写TagMapperpackage com.example.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import com.example.pojo.Tag; public interface TagMapper extends baseMapper编写测试类进行测试{ }
package com.example;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import com.example.mapper.TagMapper;
import com.example.pojo.Tag;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class LogicDeleteTests {
@Resource
TagMapper mapper;
}
测试删除
@Test
public void testDelete() {
// 删除 id 为 1,2,5的记录
mapper.deleteBatchIds(Arrays.asList(1,2,5));
}
生成的sql代码:
==> Preparing: UPDATE tag SET is_delete=1 WHERe id IN ( ? , ? , ? ) AND is_delete=0 ==> Parameters: 1(Integer), 2(Integer), 5(Integer) <== Updates: 3
mybatis-plus并没有执行delete语句,而是使用了update语句将对应记录的is_delete字段改为了1.
测试查询@Test
public void testSelect(){
// 查询id小于10的记录
QueryWrapper wrapper = new QueryWrapper().lt("id", 10);
List tags = mapper.selectList(wrapper);
tags.forEach(System.out::println);
}
生成的sql代码及程序输出:
==> Preparing: SELECT id,name,is_delete FROM tag WHERe is_delete=0 AND (id < ?) ==> Parameters: 10(Integer) <== Total: 6 Tag(id=3, name=标签3, isDelete=0) Tag(id=4, name=标签4, isDelete=0) Tag(id=6, name=标签6, isDelete=0) Tag(id=7, name=标签7, isDelete=0) Tag(id=8, name=标签8, isDelete=0) Tag(id=9, name=标签9, isDelete=0)
mybatis-plus在select语句后自动拼接了WHERe is_delete=0以免查出已删除的记录.
测试更新@Test
public void testUpdate(){
// 将 id小于11的标签名 改为原来的名字拼接上''
UpdateChainWrapper updateChain = new UpdateChainWrapper<>(mapper);
updateChain.setSql("`name`=concat(`name`,'')").lt("id",11).update();
}
生成的sql代码:
==> Preparing: UPDATE tag SET `name`=concat(`name`,'') WHERe is_delete=0 AND (id < ?) ==> Parameters: 11(Integer) <== Updates: 7
类似于查询语句,mybatis-plus在update语句后自动拼接了WHERe is_delete=0以免更新已删除的记录.
测试插入@Test
public void testInsert(){
Tag tag = new Tag();
tag.setName("标签21");
mapper.insert(tag);
}
生成的sql语句
==> Preparing: INSERT INTO tag ( name ) VALUES ( ? ) ==> Parameters: 标签21(String) <== Updates: 1
mybatis-plus并不会在insert语句中,将is_delete设为0,不过我们可以在数据库中为该字段设置默认值.
在Mybatis-plus配置项中配置逻辑删除在application.yml配置文件中配置逻辑删除,就不需要在每个实体类中都使用@TableLogic注解了
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDelete
logic-delete-value: 1
logic-not-delete-value: 0
上一篇:MyBatisPlus之字段填充
下一篇:MyBatisPlus之乐观锁



