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

news2024/11/16 20:50:52

前言

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

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

正文 

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


① 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.coloradmin.cn/o/192734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现报表集成?(三)——资源集成

在上一篇&#xff0c;我们介绍了用户同步和单点登录&#xff0c;帮助用户了解什么是用户同步、如何做用户验证&#xff0c;以及如何实现单点登录。 这一篇&#xff0c;我们看下如何做资源集成。行文过程中得到了来自报表软件厂商 Smartbi 的报表产品&#xff1a;电子表格软件的…

leetcode-每日一题-1663-具有给定数值的最小字符串(简单,贪心)

很久没有做过贪心类型的题目了&#xff0c;因为用的很少&#xff0c;大多都用的dp&#xff0c;这道题第一眼看过去以为是dp&#xff0c;因为力扣里面的中等题很多都是dp&#xff0c;但仔细一看发现是贪心&#xff0c;思路其实很简单&#xff0c;先全部最小&#xff0c;中间插一…

机械设备ERP系统可以给企业带来哪些好处?

随着信息化技术的进步与智能制造的发展趋势&#xff0c;很多制造企业也在一直探寻适合自己的信息化管理转型之路。机械设备EPR系统对于机械设备制造企业来说就是关键一环。要充分发挥出机械设备ERP系统的赋能作用&#xff0c;必不可少的是从生产制造的各个环节出发&#xff0c;…

ONLYOFFICE 文档 v7.3 现已发布:表单角色、SmartArt、安全性设置、查看窗口等功能

在 ONLYOFFICE 最新版本的在线编辑器中现已提供高级表单、SmartArt 图形插入、增强密码保护和公式计算、幻灯片特殊粘贴项等多项功能。继续阅读以了解所有更新。 字段填写接收人角色 现在&#xff0c;数字表单将更加高效。您可为需要填写表单的用户分配各种角色&#xff0c;简…

中医名词看不懂?用PaddleNLP做一个中医“百科全书”

我是一个深度学习爱好者&#xff0c;目前对自然语言处理感兴趣&#xff0c;热衷于了解一些人工智能中的数学推导和经典论文复现&#xff0c;正在成长的“小趴菜”一枚&#xff0c;在PPDE指导计划中&#xff0c;创作了中医文献阅读理解项目&#xff0c;下面将由我介绍在项目创作…

Java开发面试(技术面)经历 (二)

2022-11-08&#xff0c;应聘Java开发 &#xff1a;云智慧&#xff08;实训机构&#xff0c;个人观点&#xff0c;与培训没区别&#xff09; 今天二面技术面&#xff0c;问了一些问题 1.集合有哪些&#xff1f; 两大容器如图&#xff1a;Collection集合 list下面还有Vector&…

Veeam Backup Replication v12 发布 (含下载) - 面向所有工作负载的备份软件

Veeam Availability Suite v12 请访问原文链接&#xff1a;https://sysin.org/blog/veeam-backup-12/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 全球首屈一指的备份和恢复提供商 管理、控制、保护您的 数据&#xff…

数字化基本概念

数字化是什么&#xff1f;为什么要做数字化转型&#xff1f;感觉只是用计算机软件替代了原有的工作和流程。 听多了&#xff0c;每天的工作也被冠以数字化&#xff0c;说来很重要&#xff0c;确是不清楚为何&#xff0c;也来了解一下。 数字化&#xff1a;改变做事方式、发…

分享企业做微信小程序开发的步骤_公司如何申请微信小程序步骤

对于小程序新手来说&#xff0c;想要建立一个小程序&#xff0c;第一步就是要拥有一个小程序。那么如何开通小程序&#xff1f;公司小程序如何申请&#xff1f;今天就来手把手教你们如何开通小程序吧&#xff1a; 一、填写帐号信息 到微信公众平台首页&#xff0c;直接点击帐号…

android——开发中哪些习惯会影响卡顿的发生

开发中哪些习惯会影响卡顿的发生&#xff0c;如下&#xff1a;1.布局太乱&#xff0c;层级太深。1.1&#xff1a;通过减少冗余或者嵌套布局来降低视图层次结构。比如使用约束布局代替线性布局和相对布局。1.2&#xff1a;用 ViewStub 替代在启动过程中不需要显示的 UI 控件。1.…

C#学习记录——C# winform程序怎么打包成安装项目(VS2019图解)

今天学习将Winform程序打包成安装项目&#xff0c;参考网上教程&#xff0c;并记录尝试过程。 测试打包的程序为用C# Winform开的的一个客户端程序。 1、安装打包插件 在程序打包之前需要安装Microsoft Visual Studio Installer Projects插件。 1.1、选择扩展管理 在VS2019…

(面经四):笔试

面试经历&#xff08;四&#xff09; 时间&#xff1a;2022-11-14 笔试 &#xff08;培训机构真该洗啊&#xff0c;写完后根本不看你写的笔试&#xff0c;直接给你说送你去培训&#xff0c;技术什么都没有问&#xff0c;直接拿着你的简历画画&#xff0c;画什么实训和培训的不同…

Docker建立自己的私有仓库

仓库&#xff08;Repository&#xff09;是集中存放镜像的地方。 一个容易混淆的概念是注册服务器&#xff08;Registry&#xff09;。实际上注册服务器是管理仓库的具体服务 器&#xff0c;每个服务器上可以有多个仓库&#xff0c;而每个仓库下面有多个镜像。从这方面来说&am…

Python学习------起步3(序列与数据类型转换)

目录 序列 1.切片 2.列表&#xff08;list&#xff09; 3.元组 数据类型转换 习题 好了&#xff0c;今天就开始序列的学习了&#xff0c;其实在C语言里面我们学过数组或者字符数组&#xff0c;Python中的序列跟它们一样是一种数据的储存方式&#xff0c;其中学习过程也是比…

LeetCode动态规划(九):完全背包(初级)

学习目标&#xff1a; 理解完全背包和0-1背包遍历顺序的区别 学习内容&#xff1a; 15. LeetCode377. 组合总和 Ⅳhttps://leetcode.cn/problems/combination-sum-iv/ 16. 爬楼梯(进阶班版) 17. LeetCode322. 零钱兑换https://leetcode.cn/problems/coin-change/ 18. Leet…

winform发布功能附加dll、db、xml、json等文件

我们日常进行程序的更新升级可能会用到winform的发布功能&#xff0c;但有些文件可能会无法伴随着发布一同发布出去或者每次发布后文件的数据被覆盖&#xff0c;下面一起看一下怎么解决&#xff1a; winform发布功能参考我另一篇文章https://blog.csdn.net/qq_39569480/articl…

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

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

leetcode51,52 N皇后相关(回溯方法)

题目1&#xff1a;N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题…

入职一年,那个准的下班的人,比我先升职了...

最近心态崩了。 和我同期一道进公司的人又升了一级&#xff0c;可是明明大家在进公司时&#xff0c;他不论是学历还是工作经验&#xff0c;样样都不如自己&#xff0c;眼下不过短短的两年时间便一跃在自己的职级之上&#xff0c;这着实让我有几分不甘心。 我想不明白&#xff…

谈谈Linux epoll惊群问题的原因和解决方案

近期排查了一个问题&#xff0c;epoll惊群的问题&#xff0c;起初我并不认为这是惊群导致&#xff0c;因为从现象上看&#xff0c;只是体现了CPU不均衡。一共fork了20个Server进程&#xff0c;在请求负载中等的时候&#xff0c;有三四个Server进程呈现出比较高的CPU利用率&…