Mybatis Plus 删除数据(超详细)
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观
大家好,我是小哈。
本小节中,我们将学习如何通过 Mybatis Plus 删除数据库表中的数据。
表结构
为了演示删除数据,在前面小节中,我们已经定义好了一个用于测试的用户表, 执行脚本如下:
DROP TABLE IF EXISTS user;
CREATE TABLE `user` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(30) NOT NULL DEFAULT '' COMMENT '姓名',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
`gender` tinyint(2) NOT NULL DEFAULT 0 COMMENT '性别,0:女 1:男',
PRIMARY KEY (`id`)
) COMMENT = '用户表';
定义实体类
定义一个名为 User
实体类:
@TableName("user")
public class User {
/**
* 主键 ID, @TableId 注解定义字段为表的主键,type 表示主键类型,IdType.AUTO 表示随着数据库 ID 自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 性别
*/
private Integer gender;
}
不明白 Mybatis Plus 实体类注解的小伙伴,可参考前面小节 , 有详细解释。
开始删除数据
Mybatis Plus 对 Mapper 层和 Service 层都将常见的增删改查操作封装好了,只需简单的继承,即可轻松搞定对数据的增删改查,本文重点讲解删除数据这块。
Mapper 层
定义一个 UserMapper
, 让其继承 BaseMapper
:
public interface UserMapper extends BaseMapper<User> {
}
然后,注入 Mapper :
@Autowired
private UserMapper userMapper;
删除相关的方法均以 delete
开头,方法如下:
解释一下每个方法的作用:
// 根据主键 ID 删除 (直接传入 ID)
int deleteById(Serializable id);
// 根据主键 ID 删除 (传入实体类)
int deleteById(T entity);
// 根据主键 ID 批量删除
int deleteBatchIds(Collection<?> idList)
// 通过 Wrapper 条件构造器删除
int delete(Wrapper<T> queryWrapper);
// 通过 Map 设置条件来删除
int deleteByMap(Map<String, Object> columnMap);
示例代码
根据主键 ID 删除 (直接传入 ID):
// 实际执行的 SQL : DELETE FROM user WHERE id=9
int count = userMapper.deleteById(9L);
System.out.println("受影响的行数:" + count);
根据主键 ID 删除 (传入实体类):
User user = new User();
user.setId(9L);
// 实际执行的 SQL : DELETE FROM user WHERE id=9
int count = userMapper.deleteById(user);
System.out.println("受影响的行数:" + count);
根据主键 ID 批量删除:
// 根据 ID 批量删除
List<Long> ids = new ArrayList<>();
ids.add(1L);
ids.add(2L);
// 实际执行 SQL 为 :DELETE FROM user WHERE id IN ( 1 , 2 )
userMapper.deleteBatchIds(ids);
通过 Wrapper 条件构造器删除:
// 构造删除条件
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("name", "犬小哈1");
wrapper.eq("age", 1);
// 实际执行 SQL 为 :DELETE FROM user WHERE (name = '犬小哈1' AND age = 1)
userMapper.delete(wrapper);
// Lambda 表达式形式
userMapper.delete(new QueryWrapper<User>()
.lambda()
.eq(User::getName, "犬小哈")
.eq(User::getAge, 1));
通过 Map 设置条件来删除:
// 通过 Map 设置条件来删除
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("name", "犬小哈1");
columnMap.put("age", 1);
int count = userMapper.deleteByMap(columnMap);
System.out.println("受影响的行数:" + count);
实际执行日志如下:
Service 层
Mybatis Plus 同样也封装了通用的 Service 层 CRUD 操作,并且提供了更丰富的方法。接下来,我们上手看 Service 层的代码结构,如下图:
先定义 UserService
接口 ,让其继承自 IService
:
public interface UserService extends IService<User> {
}
再定义实现类 UserServiceImpl
,让其继承自 ServiceImpl
, 同时实现 UserService
接口,这样就可以让 UserService
拥有了基础通用的 CRUD 功能,当然,实际开发中,业务会更加复杂,就需要向 IService
接口自定义方法并实现:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
注入 UserService
:
@Autowired
private UserService userService;
Service 层封装的删除方法均以 remove
开头,方法如下:
这里把常用的一些删除方法摘出来:
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
从方法入参可以看出来,和 Mapper 层是删除在使用上基本一样,如何使用可参考 Mapper 层的使用示例代码。