5.9 mybatis之callSettersOnNulls作用

news2024/11/18 2:30:35

文章目录

  • 1. 当callSettersOnNulls=true时
  • 2. 当callSettersOnNulls=false时

在mybatis的settings配置参数中有个callSettersOnNulls参数,官方解释为:指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。什么意思呢?

我们先看下面一段解释,不理解没关系,等看完下面的代码示例后再回来看一定会理解。

我们假设要把数据库中一条数据映射到java中Map类型的对象上,库表字段名为Map中的key,库表字段值为Map的value,假如库表中某字段为null,映射到Map中的key和value是什么样的呢?当callSettersOnNulls=true时,会把这个字段名映射到key上,把null值put到value上;当callSettersOnNulls=false时,就不会把这个字段名映射到key上,也即Map中根本就不存在这个key,当遍历这个Map时就会少了这个key。所以说,对于返回类型Map的场景,如果在java代码中对于库表字段值为null的也要输出或者处理,就要把空的字段也要映射到Map的key和value中。
但是当返回类型为Bean类型时,库表中某字段为null,当callSettersOnNulls=true,会把null值set到Bean对象对应的字段属性上,那么该属性值为null;当callSettersOnNulls=false时,就不会调set方法就不会把null值set到Bean对象对应的字段属性上,那么该字段属性由于没有set内容,默认还是null。所以对于返回类型为Bean的场景,callSettersOnNulls配置true还是false无所谓。

如果没有理解上面一段话我们看一下下面的案例,假设要把库表PERSON中一条数据映射到java的Map对象中。

库表PERSON如下所示
在这里插入图片描述

1. 当callSettersOnNulls=true时

mybatis配置如下所示

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="callSettersOnNulls" value="false"/>
</settings>

mapper中SQL如下所示,假设查询PERSON_ID=13的一条数据,该条数据的PERSON_SEX列值为NULL。

<select id="select2" resultType="Map">
    select * from PERSON where PERSON_ID = #{personId}
</select>

测试案例如下所示,查询到数据映射到map后,然后打印出所有的key和value

public void sqlSessionTest3(){
    SqlSessionFactory factory = mybatisUtil.getFactory();
    SqlSession sqlSession = factory.openSession(true);  //true表示自动提交
    Map<String, Object> map = sqlSession.selectOne("com.lzj.dao.PersonDao.select2", 13);
    for (String key : map.keySet()){
        System.out.println("key=" + key);
        System.out.println("value=" + map.get(key));
        System.out.println("================");
    }
    sqlSession.close();
}

执行结果如下所示,发现即使person_sex列为空,但map中依然有key为person_sex,但value为null,说明当callSettersOnNulls=true时,把person_sex字段名映射到了key上,把null值put到value上。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 2259527.
==>  Preparing: select * from PERSON where PERSON_ID = ? 
==> Parameters: 13(Integer)
<==    Columns: person_id, person_name, person_age, person_sex
<==        Row: 13, Jerry, 20, null
<==      Total: 1
key=person_sex
value=null
================
key=person_name
value=Jerry
================
key=person_age
value=20
================
key=person_id
value=13
================
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@227a47]

2. 当callSettersOnNulls=false时

还是以上面的案例所示,只不过把配置文件修改成如下所示

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="callSettersOnNulls" value="false"/>
</settings>

重新运行上面的测试案例,输出如下所示,输出的map中不再含有名字为person_sex的key,说明当callSettersOnNulls=false时,就不会把person_sex字段名映射到key上,也即Map中根本就不存在这个key。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 219192399.
==>  Preparing: select * from PERSON where PERSON_ID = ? 
==> Parameters: 13(Integer)
<==    Columns: person_id, person_name, person_age, person_sex
<==        Row: 13, Jerry, 20, null
<==      Total: 1
key=person_name
value=Jerry
================
key=person_age
value=20
================
key=person_id
value=13
================
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@d109c4f]

注意:如果在java应用中,如果要遍历库表列对应的所有key时,只能配置callSettersOnNulls=true,因为如果配置callSettersOnNulls=false时,map中不存在库表列值为NULL对应的key。

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

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

相关文章

SecureCRT日志记录的7个经典配置记录与14个环境变量(%Y-%M-%D_%H_%S_session.log %t )

每次更换电脑、主机或者环境都需要配置一遍SecureCRT的参数。感觉就最近十年都已经设置过上百次了。其实设置没什么特别的&#xff0c;只是经过不断地打磨&#xff0c;主打的就是一个经济实用。经常忘记&#xff0c;特此记录。 配置方式 建议直接配置默认session&#xff1a;…

error:0308010C:digital envelope routines::unsupported(问题分析)

error:0308010C:digital envelope routines::unsupported 情况一&#xff1a;就是网上大部分人说的node 17版本的问题 出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制&#xff0c;可能会对生态系统造成一些影响…

宝妈如何在家创造收入?五种兼职工作让你轻松赚钱!

许多宝妈为了陪伴孩子成长&#xff0c;毅然选择了全职妈妈的角色&#xff0c;然而&#xff0c;她们内心仍希望能有一份收入&#xff0c;实现经济独立。于是&#xff0c;寻找既能照顾家庭又能赚钱的工作成了她们的迫切需求。 然而&#xff0c;这样的需求也往往让宝妈们成为一些…

策略为王股票软件源代码\StkUI\View\BaseView.cpp-------显示股票基本资料的视图-------程序代码都在里面了

CString strHeader info.GetStockCode(); strHeader " "; /修改 strHeader info.GetStockName(); strHeader "\r\n\r\n "; GetEditCtrl().SetWindowText( strHeader ); GetEditCtrl().SetSel…

寻找心灵慰藉:这些平台上有最好的解压视频

在这个快节奏的社会中&#xff0c;解压视频成为了我们放松心情的小帮手。这些视频通常具有令人着迷的视觉效果和舒缓的背景音乐&#xff0c;能够帮助我们暂时脱离紧张的工作或生活状态。如果你正在寻找这样的视频&#xff0c;以下几个平台可以满足你的需求&#xff1a; 蛙学网…

AI在运维实践中的价值提升

在2024年的AI赛道上&#xff0c;利用大数据 、机器学习算法、人工智能来改善运维效率已成为软件运营商发展的新主张&#xff0c;通过AI在运维流程的洞察、决策和执行&#xff0c;从而提升效率、减少故障时间&#xff0c;优化用户体验。通过分析大量数据来识别趋势和模式&#x…

免费VPS云服务器汇总,最长永久免费使用

目前云服务器市场竞争很激烈&#xff0c;为了方便吸引上云&#xff0c;很多云计算服务商提供免费试用云服务器&#xff0c;下面给大家整理汇总一下免费VPS云服务器&#xff0c;最长永久免费使用&#xff01; 一、雨云&#xff08;优惠码:ABC&#xff09; 活动地址&#xff1a;…

Python爬虫-京东商品评论数据

前言 本文是该专栏的第68篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍京东滑块验证码的解决方法,感兴趣的同学,可以直接翻阅文章《Python如何解决“京东滑块验证码”(5)》进行查看。 而本文,笔者以京东商品详情页的评论数据为例,通过…

直播弹幕系统设计

本文仅提供思路参考&#xff0c;并非完备的详细设计。 特点 其实很类似IM即时通讯系统&#xff0c;是个变种&#xff0c;本质也是在一个空间内收发消息 消息及时性强&#xff0c;过期消息意义不大用户松散&#xff0c;随时来随时走可能有瞬时大批量弹幕&#xff08;比如比赛精…

整数在内存中的存储和内存操作函数

目录 整数在内存中的存储1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端?2.2 为什么有大小端 3. 练习3.1 请简述大端字节序和小端字节序的概念&#xff0c;设计⼀个小程序来判断当前机器的字节序。&#xff08;10分&#xff09;-百度笔试题3.2 练习23.3 练…

Linux三剑客-sed、awk、egrep(上)

一、知识梗概 二、正则表达式 定义&#xff1a;正则表达式是一种强大的文本处理工具&#xff0c;用于在文本中搜索符合特定模式的字符串。它由一系列特殊字符和普通字符组成&#xff0c;可以定义复杂的搜索模式。正则表达式被广泛应用于各种编程语言和文本处理工具中。 简单来…

【DNS】

文章目录 DNS域名解析系统&#xff08;Domain Name System&#xff09;DNS系统需要解决的问题DNS域名解析系统&#xff08;Domain Name System&#xff09;问题1&#xff1a;DNS名字空间(The DNS Name Space&#xff09;DNS名字空间(The DNS Name Space)DNS名字空间(The DNS Na…

解锁生成式 AI 的力量:a16z 提供的 16 个企业指南

企业构建和采购生成式AI方面的16项改变 生成式 AI 领域趋势洞察&#xff1a;企业构建和采购生成式 AI 的方式正在发生重大转变&#xff0c;具体表现在&#xff1a;* 专注于可信度和安全性&#xff1a;75% 的企业将信任和安全性视为关键因素。* 优先考虑可扩展性和灵活性&#x…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言&#xff0c;由Google开发。Go的源代码文件以.go为扩展名&#xff0c;文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明&#xff0c;…

WXML模板语法-条件与列表渲染

wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码 也可以用wx:elif和wx:else来添加else判断 <!--pages/ifIndex/ifindex.wxml--> <view wx:if"{{type 1}}">男</view> <view wx:elif"{{type …

基于ICEEMDAN-SVD的信号去噪算法

一、代码原理 ICEEMDAN-SVD算法是一种结合了Improved Complete Ensemble Empirical Mode Decomposition with Adaptive Noise (ICEEMDAN) 和奇异值分解 (SVD) 的信号去噪方法。这种算法结合了两种先进的信号处理技术&#xff0c;旨在提高信号去噪的效果。以下是该算法的基本原…

深入理解信号上升沿与带宽的关系

信号的上升时间&#xff0c;对于理解信号完整性问题至关重要&#xff0c;高速pcb设计中的绝大多数问题都和它有关&#xff0c;很多信号完整性问题都是由信号上升时间短引起的&#xff0c;你必须对他足够重视。 信号上升时间并不是信号从低电平上升到高电平所经历的时间&#xf…

Ubuntu-22.04安装KVM虚拟机并安装Windows10

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、KVM是什么&#xff1f;二、安装步骤1.检查虚拟化2.查看KVM虚拟化3.安装KVM4.启用后台进程5.添加用户组6.重启电脑 三、使用步骤1.添加虚拟机2.配置虚拟机3.…

数据可视化高级技术Echarts(堆叠柱状图)

目录 一.如何实现 二.代码展示 1.stack名称相同&#xff08;直接堆叠&#xff09; 2. stack名称不相同&#xff08;相同的堆叠&#xff0c;不同的新生成一列&#xff09; 一.如何实现 数据堆叠&#xff0c;同个类目轴上系列配置相同的 stack 值可以堆叠放置。即在series中…

Rust取代C++? 保守了!关于未来的讨论

当各种平台在大肆讨论rust即将取代C/C的时候&#xff0c;已经有不少人意识到这种讨论是聒噪而无聊的。笔者和老师们通过周末茶会的讨论&#xff0c;认为现今世界常见的大多数编程语言都会在50-80年内被AI取代&#xff0c;同时供人类审计而诞生的“审计语言”会兴起。届时计算机…