5.9 mybatis之callSettersOnNulls作用

文章目录

  • 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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【菜狗学前端】ES6+笔记(包含Promise及async、await等)

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) &#xff08;免费&#xff09;菜狗学前端之ES6笔记https://download.csdn.net/download/m0_58355897/89135424 一 解构赋值 解构赋值 解构指的是把一个数据…

2024年广东省网络系统管理样题第3套网络部署部分

2024年广东省网络系统管理样题第3套网络部署部分 模块A&#xff1a;网络构建 极安云科专注职业教育技能培训4年&#xff0c;包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点&#xff0c;提供完整全面的系统性理论教…

Bridge 桥接

意图 将抽象部分与其显示部分分离&#xff0c;使他们都可以独立地变化。 结构 其中&#xff1a; Abstraction定义抽象类的接口&#xff0c;维护一个指向Implementer类型对象的指针。RefinedAbstraction扩展由Abstraction定义的接口。Implementor定义实现类的接口&#xff0c…

并发编程之ThreadLocal使用及原理

ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…

服务器主机关机重启告警

提取时间段内系统操作命名&#xff0c;出现系统重启命令&#xff0c;若要出现及时联系确认 重启命令&#xff1a; reboot / init 6 / shutdown -r now&#xff08;现在重启命令&#xff09; 关机命令&#xff1a; init 0 / shutdown -h now&#xff08;关机&#…

防汛物资仓库管理系统|实现应急物资仓库三维可视化

系统概述 智慧应急物资仓库可视化系统&#xff08;智物资DW-S300&#xff09;采用了 B/S 架构的设计&#xff0c;通过浏览器即可快速登录操作。实现对库房内的应急物资从申购入库、出库、调拨、库内环境监测、维修保养、检测试验、处置报废等全周期、科学、规范的管理。系统以…

恢复MySQL!是我的条件反射,PXB开源的力量...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

如何进行计量经济分析

计量经济分析是定量分析的常用方法&#xff0c;在经济分析领域有着广泛且重要的应用。计量经济分析以一定的经济理论和统计数据为基础&#xff0c;运用数学、统计学相关方法&#xff0c;通过建立计量模型&#xff0c;并运用软件进行操作&#xff0c;从而实现对经济问题的定量分…

时间序列模型:lag-Llama

项目地址&#xff1a;GitHub - time-series-foundation-models/lag-llama: Lag-Llama: Towards Foundation Models for Probabilistic Time Series Forecasting 论文地址&#xff1a;https://arxiv.org/pdf/2310.08278.pdf hugging-face镜像&#xff1a;https://hf-mirror.c…

QQ农场-phpYeFarm添加数据教程

前置知识 plugin\qqfarm\core\data D:\study-project\testweb\upload\source\plugin\qqfarm\core\data 也就是plugin\qqfarm\core\data是一个缓存文件,如果更新农场数据后,必须要删除才可以 解决种子限制(必须要做才可以添加成功) 你不更改加入了id大于2000直接删除种子 D…

Unity类银河恶魔城学习记录12-14 p136 Merge Skill Tree with Sword skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili CharacterStats.cs using System.Collections; using System.Collections.…

如何搭建SearXNG搜索引擎

小白如何搭建SearXNG搜索引擎 前言 国内用户在使用百度、360、搜狗等主流搜索引擎时&#xff0c;面临搜索结果精确度不高、广告泛滥及隐私顾虑等问题。虽然Google以其出色性能备受推崇&#xff0c;但由于无法在国内访问&#xff0c;部分用户转而选择Bing作为折衷方案&#xff…

LeetCode617:合并二叉树

题目描述 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重…

OSCP靶场--PayDay

OSCP靶场–PayDay 考点(公共exp文件上传密码复用sudo -l all提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.39 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 04:52 EDT Nmap scan report for 192…

计算机网络——ARP协议

前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结&#xff0c;讲的非常好。 可以先去看一篇视频&#xff0c;再来参考这篇笔记&#xff08;或者说直接偷走&#xff09;。 …

Spark-机器学习(1)什么是机器学习与MLlib算法库的认识

从这一系列开始&#xff0c;我会带着大家一起了解我们的机器学习&#xff0c;了解我们spark机器学习中的MLIib算法库&#xff0c;知道它大概的模型&#xff0c;熟悉并认识它。同时&#xff0c;本篇文章为个人spark免费专栏的系列文章&#xff0c;有兴趣的可以收藏关注一下&…

双子座 Gemini1.5和谷歌的本质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

流媒体的安全谁来保障

流媒体的安全谁来保障 说起媒体&#xff0c;我们马上就会想到报纸新闻、广播、电视。 其实所谓的流媒体同我们通常所指的媒体是不一样的&#xff0c; 它只是一个技术名词。流媒体到底是什么&#xff1f;能给我们的生活带来什么&#xff1f;跟小德一起来看看。 流媒体是什么&a…

缓存与数据库的数据一致性解决方案分析

在现代应用中&#xff0c;缓存技术的使用广泛且至关重要&#xff0c;主要是为了提高数据访问速度和优化系统整体性能。缓存通过在内存或更快速的存储系统中存储经常访问的数据副本&#xff0c;使得数据检索变得迅速&#xff0c;从而避免了每次请求都需要从较慢的主存储&#xf…