会当凌绝顶,一览众山小
| @Author:TTODS
MyBatisPlus框架系列文章目录:
前言
逻辑删除是指使用一个特殊的字段来表示数据库表中的一条记录是否被删除了(或是否存在).
例如为数据库表中的每一条记录都增加一个is_delete 字段,当is_delete 为1时,表示该记录已经被删除了,当is_delete 为0时,表示该字段还有效.
与逻辑删除相对的就是物理删除,指直接从数据库中删除记录.
本文介绍了如何使用MybatisPlus实现逻辑删除功能.
新建一个简单的测试表tag
CREATE 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表如下:
编写实体类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 = "0",delval = "1")
private Integer isDelete;
}
@TableLogic 用来标注表示逻辑删除的字段, value 是表示未删除的值 ,delval 是表示删除的值.
编写TagMapper
package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.pojo.Tag;
public interface TagMapper extends BaseMapper<Tag> {
}
编写测试类进行测试
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() {
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(){
QueryWrapper<Tag> wrapper = new QueryWrapper<Tag>().lt("id", 10);
List<Tag> 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(){
UpdateChainWrapper<Tag> updateChain = new UpdateChainWrapper<>(mapper);
updateChain.setSql("`name`=concat(`name`,'<update>')").lt("id",11).update();
}
生成的sql代码:
==> Preparing: UPDATE tag SET `name`=concat(`name`,'<update>') 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之乐观锁
- THE END -
|