在 Mybatis Plus 的单表操作中 in 的相关问题

简介: 之前写过一篇关于 in 与 not in 问题的文章(结合 Mybatis,探讨 Oracle 中 in 与 not in 的陷阱),现在在扩展一下,谈谈 Mybatis Plus 单表操作时 in(not in) 的相关问题。

之前写过一篇关于 in 与 not in 问题的文章(结合 Mybatis,探讨 Oracle 中 in 与 not in 的陷阱),现在在扩展一下,谈谈 Mybatis Plus 单表操作时 in(not in) 的相关问题。

先用一个简单的例子说明下问题,比如我们要查一年级所有同学的信息。经常会有下面这样的写法:

// 获取班级ID集合
List<String> classIdList = classMapper.selectList().stream()
                    .map(Class::getClassId)
                    .collect(Collectors.toList());
// 获取学生信息
List<Student> studentList = studentMapper.selectList(
        new QueryWrapper<Student>().lambda()
                .in(Student::getClassId, classIdList)
);

这样的写法,咋一看没什么问题。开发人员在开发过程中,也没发现问题,因为语句能执行,查询有数据。但是到了测试的时候,问题就来了。只是查一年级学生的数据,结果把全校的学生都查出来了。

会出现这样的问题,原因有两个:

  1. 查询出来的 classIdList 数据为空。
  2. 查询学生信息时,in 条件失效。

之所以有这样的问题出现,是开发人员在开发过程中有以下一些误区:

误区一:查询语句必定能取到数据。

对于初学者,甚至工作一段时间的开发人员都会有这么一个误区,自己写好的查询语句一定是对的,而且一定能查出数据。会有这样自我感觉良好的情况出现,原因来自于开发的模式。在做功能开发的时候,一开始数据库是没有任何数据的,需要开发人员手动录入。而为了使功能可以正常运行,开发人员录入的数据会保证每个方法都能得到相应的结果,即查询的时候有值。这就导致了开发过程中容易漏掉查询无数据的情况。

误区二:查询语句的条件必定生效。

在上面的例子中,因为 classIdList 为空,Mybatis Plus 在组装 SQL 语句时,是不会把 in 这个条件拼接进来的,从而导致查询语句时没有 in 这个约束条件的。即,当条件 in 中的数组为空时(classIdList 为空),in 是无效的。

避免再次产生类似的问题,也有比较简单的处理办法。即,凡是查询语句,均对查询结果进行判断。

将例子中的代码修改为比较正确的形式,示例如下:

// 获取班级ID集合
List<String> classIdList = classMapper.selectList().stream()
        .map(Class::getClassId)
        .collect(Collectors.toList());

if (classIdList.isEmpty()) {
    return new ArrayList<>();
}

// 获取学生信息
List<Student> studentList = studentMapper.selectList(
        new QueryWrapper<Student>().lambda()
                .in(Student::getClassId, classIdList)
);

以上就是本文的全部内容,希望对大家有帮助。


如果文章有帮助到了你,欢迎点赞、转发。

如果文章有错误的地方,欢迎留言交流。

image

相关文章
|
5月前
|
XML Java 数据库连接
【MyBatis】MyBatis操作数据库(一)
【MyBatis】MyBatis操作数据库(一)
52 1
|
5月前
|
SQL 存储 Java
基于MyBatis的增删改查操作
基于MyBatis的增删改查操作
42 1
|
4月前
|
Java 数据库连接 测试技术
mybatis plus 获取新增实体的主键
mybatis plus 获取新增实体的主键
144 8
|
4月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
59 7
|
4月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
94 4
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
92 3
|
4月前
|
Java 数据库连接 数据库
mybatis plus 中增删改查及Wrapper的使用
mybatis plus 中增删改查及Wrapper的使用
217 3
|
4月前
|
算法 Java 数据库连接
mybatis plus 主键策略
mybatis plus 主键策略
56 2
|
5月前
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
127 3
我们后端程序员不是操作MyBatis的CRUD Boy
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作