🍀 前言
博客地址:
- 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