深入解析Mybatis-Plus框架:简化Java持久层开发(七)

🍀 前言

博客地址:

👋 简介

本章节介绍如何通过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

✏ 总结

💖 欢迎关注我的公众号

在这里插入图片描述

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值