mybatis查询结果resultMap映射vo源码分析

概述

mybatis是一个常用的持久层框架;通常搭配mysql使用;
在将查询结果映射成一个复杂vo的时候,通常会用到resultMap,在其中嵌套associationcollection等操作;将一个复杂查询拆分成简单查询;

vo中的变量有时候会定义初始值,那么当mybatis中查询结果为null的时候,会覆盖这个初始值吗;

mybatis版本:3.5.10
mysql版本:8.0.32

源码分析

映射结果集入口
org.apache.ibatis.executor.resultset.ResultSetHandler

public interface ResultSetHandler {// 处理结果集,生成相应的结果对象集合<E> List<E> handleResultSets(Statement stmt) throws SQLException;// 处理结果集,返回游标对象<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;// 处理储存过程的输出参数 void handleOutputParameters(CallableStatement cs) throws SQLException;
}

进入实现类
org.apache.ibatis.executor.resultset.DefaultResultSetHandler

结果集的处理方法
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSets

捞一张网图
在这里插入图片描述

一般都只会返回一个结果集,再进一步观察,里面调用的都是handleRowValues方法,在该方法中区分了嵌套ResultMap普通ResultMap(包括普通的resultType也会转成ResultMap,只是框架自动帮你转了)

org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSet
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleRowValues

handleRowValuesForSimpleResultMap:处理简单的结果集映射
handleRowValuesForNestedResultMap:处理嵌套的结果集映射(resultMap> 声明时 是否包含 association、collection、case 关键字)

在最后映射的时候都是调用了
如果开启了自动映射,对实例进行自动赋值
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#applyAutomaticMappings

对用户主动声明的属性进行映射
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#applyPropertyMappings

在赋值的时候可以看到图中判断;
configuration.isCallSettersOnNulls()代表配置中null值是否调用set方法,顾名思义;

我的配置中set为true;

#mybatis plus 设置
mybatis-plus:configuration:# 返回类型为Map,显示null对应的字段call-setters-on-nulls: true

在这里插入图片描述

所以如果返回vo中想要在查询结果为null时,不覆盖vo的值;

  1. 改配置
  2. vo字段类型改为基础类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218515.shtml

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

相关文章

数据云:数据基础设施的一小步,数字经济的一大步

随着数字经济的崛起&#xff0c;数据正成为推动社会发展和经济增长的核心要素。在这个数字化时代&#xff0c;数据已经被誉为新的生产要素&#xff0c;是数字经济发展的基础性资源和战略性资源。为了更好地支持数据的汇聚、流通和应用&#xff0c;数据基础设施迎来了一次重要的…

WSL 配置 Docker 内存和 CPU 资源限制

我用的电脑一共有40G内存&#xff0c;最近发现电脑重启后&#xff0c;VmmemWSL 进程很快就会占用一多半的内存&#xff08;20G&#xff09;&#xff0c;电脑中有多个停止运行的容器&#xff0c;正常启动状态的只有一个 MySQL 服务&#xff0c;通过 docker stats 查看占用内存也…

PyCharm安装教程

1.1 为什么要安装python开发环境 上一篇文章我们安装了python&#xff0c;准确来说是python解释器&#xff0c;它没有自带的可视化开发工具&#xff0c;只能通过命令行窗口来执行python代码&#xff0c;这里我们就来下载一个用于python开发的可视化工具——PyCharm。 1.2 PyC…

boost1.55 安装使用教程 windows

第一步 &#xff1a;首先在boost官网上下载库压缩包 添加链接描述 选择自己需要的版本进行下载 解压后执行booststrap.bat 用来生成创建b2.exe 和bjam.exe 拓展&#xff1a;.\b2 --help 了解一下有哪些参数可以配置 默认b2.exe编译后&#xff0c;链接到项目如果出现如下错误…

人工智能基本常识:让深度学习技术更加人性化

近年来&#xff0c;人工智能技术日臻成熟。现在&#xff0c;许多产品和服务都依靠人工智能技术实现自动化和智能化&#xff0c;因此它与我们的日常生活息息相关。无论是为我们带来各种便利的家用设备&#xff0c;还是我们一直在使用的产品制造方式&#xff0c;人工智能的影响无…

低代码开发与传统软件开发:未来趋势与竞争格局

近年来&#xff0c;低代码开发平台的快速发展引起了各行各业的广泛关注。低代码开发平台简化了软件开发的复杂性&#xff0c;提供了更快速、更灵活的开发方式。于是&#xff0c;许多人开始产生一个疑问&#xff1a;未来低代码开发是否会取代传统软件开发&#xff1f;今天这篇文…

ThinkPHP6使用Validate验证表单字段唯一

ThinkPHP6使用Validate验证表单字段唯一 1.创建用户验证文件&#xff0c;如User 1.1 单应用创建验证文件 php think make:validate User 1.2 多应用创建验证文件&#xff0c;admin为应用名&#xff0c; php think make:validate adminUser 创建成功后&#xff0c;应用内会…

java8与java9新特性对比

Java 8和Java 9是Java语言的两个重要版本&#xff0c;它们分别引入了许多新的特性和改进。下面是Java 8和Java 9的一些主要特性对比&#xff1a; Lambda表达式和函数式接口 Java 8引入了Lambda表达式和函数式接口&#xff0c;使得在Java中能够更方便地编写函数式风格的代码。L…

nodejs微信小程序+python+PHP沧州地区空气质量数据分析系统-计算机毕业设计推荐 django

本系统不仅主要实现了注册登录&#xff0c;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;城市区域管理&#xff0c;空气状况管理&#xff0c;空气质量管理&#xff0c;系统管理&#xff0c;数据爬取&#xff0c;大屏分析等功能&#xff0c;通过这些功能基本可…

CompressAI benchmark经典/传统图像编码器的使用

文章目录 使用简介安装依赖编译安装BPG 使用简介 CompressAI的github仓库中Usage-Evaluation给出了传统编解码器的使用帮助&#xff0c;但是并未给出详细的使用方法。本文旨在进行总结使用方法。下图是传统编解码器相关代码的存放地点&#xff0c;其中codecs为各种编解码器类的…

Java版企业电子招标采购系统源码—鸿鹄电子招投标系统-企业战略布局下的采购寻源

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

Impala4.x源码阅读笔记(二)——Impala如何高效读取Iceberg表

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 Iceberg表是一种用于存储大规模结构化数据的…

Shiro框架权限控制

首先去通过配置类的用户认证&#xff0c;在用户认证完成后&#xff0c;进行用户授权&#xff0c;用户通过授权之后再跳转其他的界面时&#xff0c;会进行一个验证&#xff0c;当前账号是否有权限。 前端权限控制显示的原理 在前端中&#xff0c;通常使用用户的角色或权限信息来…

L1-040:最佳情侣身高差

题目描述 专家通过多组情侣研究数据发现&#xff0c;最佳的情侣身高差遵循着一个公式&#xff1a;&#xff08;女方的身高&#xff09;1.09 &#xff08;男方的身高&#xff09;。如果符合&#xff0c;你俩的身高差不管是牵手、拥抱、接吻&#xff0c;都是最和谐的差度。 下面就…

如何建立一套完善的销售管理体系?

如何建立一套完善的销售管理体系&#xff1f; 该提问下已有许多专业的回答&#xff0c;从多个角度为题主出谋划策&#xff1a;销售主管如何提升个人能力、销售团队如何管理、PDCA管理方法论、销售闭环……似乎都与硬性的个人能力挂钩&#xff0c;销售能力、管理能力等等。 或…

使用Java实现桶排序算法

文章目录 桶排序算法 今天来看看桶排序算法&#xff1a; 桶排序算法 &#xff08;1&#xff09;基本思想&#xff1a;把数组 arr 划分为 n 个大小相同子区间&#xff08;桶&#xff09;&#xff0c;每个子区间各自排序&#xff0c;最后合并 。计数排序是桶排序的一种特殊情况…

UI 优先的统一身份认证系统 Casdoor

Casdoor 是一个基于 OAuth 2.0 / OIDC 的 UI 优先集中认证 / 单点登录 (SSO) 平台&#xff0c;简单点说&#xff0c;就是 Casdoor 可以帮你解决 用户管理 的难题&#xff0c;你无需开发用户登录注册等与用户鉴权相关的一系列功能&#xff0c;只需几个步骤&#xff0c;简单配置&…

并发包工具类详解

1、CountDownLatch工具详解 这是一个同步助手&#xff0c;允许一个或者多个线程等待一些列的其他线程执行结束。CountDownLatch是基于同步控制器AQS&#xff08;AbstractQueuedSynchronizer&#xff09;实现的。 具体详见&#xff1a; Latch&#xff08;门阀&#xff09;设计模…

电商控制台系统前台注册登录后台审核的测试

电商项目&#xff08;前台&#xff09;&#xff1a; 登录接口 注册接口 后台&#xff1a; 注册审核&#xff1a;建一个线程类 注意程序中的一个问题。 这里是 5 条记录&#xff0c;2 条记录显示应该是 3 页&#xff0c;实际操作过程 有审核机制&#xff0c;出现了数据记录动态变…

Java正则表达式的使用

标题&#xff1a;Java正则表达式的使用 介绍&#xff1a; 正则表达式是一种强大的文本匹配模式和搜索工具。在Java中&#xff0c;通过使用正则表达式&#xff0c;我们可以快速有效地进行字符串的匹配、查找和替换。本文将介绍Java正则表达式的基本使用方法&#xff0c;并提供相…