🍀 前言
博客地址:
- CSDN:https://blog.csdn.net/powerbiubiu
👋 简介
本章节介绍如何通过Mybatis-Plus删除数据库中的数据。
本章节不需要前置准备,继续使用之前的测试类,数据库表进行操作。
📖 正文
1 Mapper接口
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据主键 ID 删除 (传入实体类)
int deleteById(T entity);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
前面已经简单介绍过int deleteById(Serializable id)
,这里不在介绍,int deleteById(T entity)
的方式也比较简单,这里也不再介绍。
1.1 deleteBatchIds
通过id批量进行删除
需求:删除id为4和5的角色信息
@Test
public void deleteByMapper() {List<Long> ids = new ArrayList<>();ids.add(4L);ids.add(5L);int i = roleMapper.deleteBatchIds(ids);System.out.println("批量删除:" + i);
}// 批量删除:2
实际执行的SQL
DELETE FROM tb_role WHERE id IN ( 4 , 5 )
1.2 delete
根据实体删除
需求:删除角色名称为测试角色6号
的角色
@Test
public void deleteByMapper() {LambdaQueryWrapper<Role> wrapper = new LambdaQueryWrapper<>();wrapper.eq(Role::getRoleName,"测试角色6号");int i = roleMapper.delete(wrapper);System.out.println("删除:" + i);
}// 删除:1
这里的条件构造器使用的是Lambda
的方式,同时也可以用一下方式来写
LambdaQueryWrapper<Role> wrapper = Wrappers.<Role>lambdaQuery().eq(Role::getRoleName, "测试角色6号");
实际执行的SQL
DELETE FROM tb_role WHERE (role_name = '测试角色6号')
通过执行代码,我们可以知道第一个参数需要传入实体类的字段,也就是对应数据库的列名,第二个参数则是我们需要匹配的内容。
default Children eq(R column, Object val) {return this.eq(true, column, val);
}Children eq(boolean condition, R column, Object val);
根据分析源码可以看出,两个参数的eq
方法调用了三个参数的eq
方法,并第一个参数默认true
,如果该值为false
,那么表示该条件不加入生成的sql中,就只会执行DELETE FROM tb_role
,不带where
的条件了,所以需要慎用,避免把数据给清空。
1.3 deleteByMap
根据列名删除,多个之间为and关系
需求:删除角色名称为测试角色2号
和角色编码为TEST02
的角色
@Test
public void deleteByMapper() {Map<String, Object> map = new HashMap<>();map.put("role_name", "测试角色2号");map.put("role_code", "TEST02");int i = roleMapper.deleteByMap(map);System.out.println("删除:" + i);
}// 删除:1
实际执行的SQL,我们就可以更好的理解deleteByMap
的用途了
DELETE FROM tb_role WHERE role_name = '测试角色2号' AND role_code = 'TEST02'
当删除的条件有一个不满足的时候,结果则会返回0
2 Service接口
// 根据 queryWrapper 设置的条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
因测试数据不够用了,所以我们手动添加一下
INSERT INTO mpdemo.tb_role (id,role_name,role_code,description,create_time,update_time,is_deleted) VALUES(3,'测试角色2号','TEST02',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0),(4,'测试角色3号','TEST03',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0),(5,'测试角色4号','TEST04',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0),(6,'测试角色5号','TEST05',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0),(7,'测试角色6号','TEST06',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0),(8,'测试角色7号','TEST07',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0),(9,'测试角色8号','TEST08',NULL,'2023-12-21 15:46:28','2023-12-21 15:46:28',0);
2.1 remove
需求:删除角色名称为测试角色8号
的角色
@Test
public void deleteByService() {LambdaQueryWrapper<Role> wrapper = Wrappers.<Role>lambdaQuery().eq(Role::getRoleName, "测试角色8号");boolean b = roleService.remove(wrapper);System.out.println("删除:" + b);
}// 删除:true
与Mapper接口不通的是,Service接口方法返回的是布尔值,而不是受影响的行数,如果该测试方法再执行一次,那么返回的结果就是删除:false
了,因为数据库已经删除了这条数据不存在了
实际执行的SQL
DELETE FROM tb_role WHERE (role_name = '测试角色8号')
2.2 removeByIds
根据id批量删除
需求,删除id为6,7的角色信息
@Test
public void deleteByService() {List<Long> ids = new ArrayList<>();ids.add(6L);ids.add(7L);boolean b = roleService.removeByIds(ids);System.out.println("批量删除:" + b);
}// 批量删除:true
实际执行的SQL
DELETE FROM tb_role WHERE id IN ( 6 , 7 )
如何批量删除id为7(不存在)
和8(存在)
的时候,返回的结果任然为true
,并不会应该某个id不存在就返回false
2.2 removeByMap
根据列名删除,多个之间为and关系
需求:删除角色名称为测试角色4号
和角色编码为TEST04
的角色
@Test
public void deleteByService() {Map<String, Object> map = new HashMap<>();map.put("role_name", "测试角色4号");map.put("role_code", "TEST04");boolean b = roleService.removeByMap(map);System.out.println("删除:" + b);
}// 删除:true
实际执行的SQL
DELETE FROM tb_role WHERE role_name = '测试角色4号' AND role_code = 'TEST04'
当删除的条件有一个不满足的时候,结果则会返回false