面试官问 ,Mybatis SELECT 查询, 集合或者单个对象,如果数据库不存在数据,需要判空吗?

news/2024/11/14 12:14:46/

前言

于昨日下班时段,本人正在与生活作斗争,收到了金三银四一线作战小队成员紧急反应的战况问题。

不熟悉的或者是不知道怎么去看源码的看官,上车了。

正文 

这面试题问的, 考察的是什么? 


① mybatis框架的应用掌握情况,如果经常用,也许是会踩坑的。

② mybatis框架源码的掌握情况,其实如果稍微看过一下源码,那这个问题还是非常明了的。

那么我们怎么去针对这个事,去了解清楚呢? 一起看看源码。

最简单的就是情景复现,debug进源码里面了。


现在就以这种最贴切的方式,带大家一块玩玩。


结论先放在最前面:

查询单条数据, 实体类接收,数据库如果没数据, 返回 的是 null , 这时候用的时候就需要判断返回值是否为null了,否则很容易报空指针。

查下多条数据, List、set集合接收, 数据库如果没数据, 返回 的是 一个size为0的 list , 这时候list不是null,但是里面的size确实没数据。


随手找到个整合了mybatis的项目, 直接写2个查询:

①查下单个数据,用实体类接收返回值
②查询多个数据,用list接收返回值
 

既然是针对数据库没有值的情况,看看mybatis返回的是null 还是 空值对象 。

所以我们在复现debug的时候,需要故意查询数据库没有数据的值,这样看源码的同时最后也能看结果。


 

我先给大家整理出这一轮源码的走向,当然这是熟悉整个mybatis执行sql过程之后就比较清晰的,如果不熟悉也没关系的,下面也是给大家一步步debug一起探索。

执行走向:

MybatisMapperProxy -> MybatisMapperMethod->SqlSessionTemplate->DefaultSqlSession->CachingExecutor->BaseExecutor->PreparedStatementHandler->DefaultResultSetHandler

不啰嗦,开整,先执行第一个,查询单个数据的。

首先进入到的是 MybatisMapperProxy.java 

位置 :com.baomidou.mybatisplus.core.override.MybatisMapperProxy

 接下来是 execute方法 ,MybatisMapperMethod.java :

位置 : com.baomidou.mybatisplus.core.override.MybatisMapperMethod

进一步简析:


其实到了这里,细看可以看到 在经历过第一步的invoke 之后, 已经是知道当前执行的mapper函数 是增删改查啥类型 ,同时也知道 returns 是 many 还是map还是单个等等。

我们现在是查下单个,debug就可以看到其实会走到下面的  


result = sqlSession.selectOne(command.getName(), param);

直接点进去源码,继续看看怎么个事。

来到DefaultSqlSession.java  的 selectOne 方法 :

位置: org.apache.ibatis.session.defaults.DefaultSqlSession

到这其实已经非常明了,如果查询单个数据, 不存在? 那就是返回null 。 


到这里,我们针对查下单个数据 ,数据库不存在的情况,其实已经水落石出,后续的debug源码感兴趣可以继续看,其实就是执行器怎么把数据处理转换设置返回了。


ps: 看源码,原来也不难啊?!  

是的,特别是mybatis的源码,我个人是非常推荐大家看的,不止是排查问题和熟悉代码,还有整个mybatis框架的代码编写、设计模式,都是很nice的,非常推荐。

跟我有过沟通的小伙伴,我都是比较推荐mybatis框架源码的,听腻了的兄弟就当我啰嗦。

继续! 看看查询集合的情况。

开始!

看到我圈出来的东西没 ?

final MybatisMapperMethod mapperMethod = cachedMapperMethod(method);

通过invoke这第一步, 拿到的 mapperMethod , 其实就已经对当前执行的mapper函数,起底了。

无论是method的类型, returnMany=true

还是returnType的类型,是个List ;

又或是当前sql的类型,type是 SELECT .

那么接下来的流程,还是一样,继续看,到了 MybatisMapperMethod.java的  execute函数:

位置 com.baomidou.mybatisplus.core.override.MybatisMapperMethod

显然就算不debug走读,粗略一看你就可以知道是会执行

result = executeForMany(sqlSession, args);

继续debug进去看看这个 executeForMany :
 

 

 来到了SqlSessionTemplate、 DefaultSqlSession  的 selectList 函数:

继续,然后是到了 CachingExecutor、BaseExecutor的 query 函数:
 继续点,看看这个queryFromDatabase函数:

 
来到了 PreparedStatementHandler的 query函数:

位置  org.apache.ibatis.executor.statement.PreparedStatementHandler

 

即将水落石出! 


看看这个DefaultResultSetHandler.java的 handleResultSets 函数 :

 抓关键:

  final List<Object> multipleResults = new ArrayList<>();

  handleResultSet(rsw, resultMap, multipleResults, null);
  
  collapseSingleResultList(multipleResults);

handleResultSet、collapseSingleResultList都是针对这个list做数据转换处理等操作(就算没数据,也是返回list,一个size为0的list),感兴趣的自己点进去,我已经收队了,有疑问看看警官怎么说。

好了,该篇就到这。


http://www.ppmy.cn/news/21540.html

相关文章

多位大厂专家鼎力推荐,44个微服务架构设计模式pdf,程序员福利

前言 本文的目标是让架构师和程序员学会使用微服务架构成功开发应用程序。 本文不仅讨论了微服务架构的好处&#xff0c;还描述了它们的弊端。读者将掌握如何在使用单体架构和使用微服务架构之间做出正确的权衡。 谁应该阅读本文&#xff1f; 本文的重点是架构和开发&#…

【C++】C++入门 命名空间 及输入与输出

前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助。 C补充C语言语法的不足&#xff0c;以及对C语言设计不合理的地方进行优化&#xff0c;比如&#x…

Python数塔dp -A

Python——动态规划——数塔dp -A n数塔dp -A 问题引入 【问题描述】 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点, 则经过的结点的数字之和最小是多少? 已经告诉你了,这是个…

筑基四层 —— 详解三子棋和扫雷

目录 一.修炼必备 二.三子棋详解 三.扫雷详解 四.三子棋和扫雷的完整代码 &#xff01;&#xff01;&#xff01;恭喜你&#xff0c;成功突破至筑基四层&#xff01;&#xff01;&#xff01; 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff…

【JavaEE初阶】第九节.多线程 (基础篇)定时器(案例三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 一、定时器概述、 二、定时器的实现 2.1 Java标准库 定时器的使用 2.2 自己模拟实现一个定时器 2.3 对自己实现的定时器的进一步优化 2.3.1 为何需要再进行优化 2…

【C++修炼之路】C++入门(中)—— 函数重载和引用

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录一、前言二、函数重载1、重载规则2、函数名修饰规则三、引用1、区分2、本质3、特性4、应用a、做参数b、做返回值5、效率比较6、常…

Git (2) :Git练习--分支的新建与合并

一.首先有个问题 &#xff1f; 在进行git练习前&#xff0c;有个问题需要提下。。。。 csdn无法登录了。 查了一下资料&#xff0c;是因为CSDN服务器的各地相应速度不一样&#xff0c;辽宁的响应是超时的&#xff0c;所以通过在hosts文件中指定域名http://csdnimg.cn的服务器…

【Unity3D插件】Build Report Tool插件,Build报告,优化包体,查看资源占用

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章介绍一下Build Report Tool插件的使用。 Build Repor…