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。

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

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

相关文章

REINFORCE及进阶算法讲解笔记

REINFORCE 总结 估计VALUE-methods没有在理论上证明收敛&#xff0c;而policy-methods不需要估计value function。 本算法总结了过去的算法&#xff0c;将过去算法作为特例看待&#xff0c;证明了即使是结合函数估计和实际采样的value梯度都可以无偏估计&#xff0c;证明了某种…

访问者模式类图与代码

某图书管理系统中管理着两种类型的文献&#xff1a;图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本540页的图书和两篇各25页的论文&#xff0c;那么馆藏文献的总页码就是590页)。采用Visitor(访问者)模式实现该要求&#xff0c;得到如图7.16所示的类图。 访…

Java_04

Servlet: Servlet即serverapplet&#xff0c;指运行在服务器端的小程序&#xff0c;是sun公司提供的一门用于开发动态web资源的技术&#xff0c;通常我们也把实现了servlet接口的java程序也称为Servlet&#xff1b; package com.example.demo;import jakarta.servlet.*;impor…

利用Sentinel解决雪崩问题(一)流量控制

1、解决雪崩问题的常见方式有四种: 超时处理:设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休止等待;舱壁模式:限定每个业务能使用的线程数&#xff0c;避免耗尽整个tomcat的资源&#xff0c;因此也叫线程隔离;熔断降级:由断路器统计业务…

数据——关键生产要素

数据作为数字经济时代的关键生产要素&#xff0c;逐步融入生产生活各方面&#xff0c;深刻影响并重构着经济社会运行和社会治理&#xff0c;已成为影响未来发展的关键战略性资源。近年来&#xff0c;我国高度重视发展数字经济、数据要素及其市场化配置改革&#xff0c;发布了一…

风电机组中仍然装有电动机吗?

风电机组中确实装有电动机。虽然风电机组的主要功能是将风能转换为电能&#xff0c;但在其启动和运行过程中&#xff0c;电动机发挥着不可或缺的作用。 在风电机组的启动阶段&#xff0c;电动机负责提供初始的启动动力。由于风力发电的特性&#xff0c;风电机组并不能在任意风…

快速安装/升级/卸载Ascend配套软件包

一、参考资料 配套MindSpore 昇腾软件安装指引&#xff08;23.0.RC3&#xff09; 快速安装CANN 二、安装Ascend配套软件包 1. Ascend配套软件包简介 Ascend配套软件包&#xff0c;包括&#xff1a;固件、驱动和CANN&#xff08;Compute Architecture for Neural Networks&…

【设计模式】六大设计原则

设计原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的六大设计原则零、单一职责原则开闭原则里氏代换原则依赖倒置原则接口隔离原则迪米特法则合成复用原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的 设计模式有23种&#xff0c;我认为对普通人来说想…

【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、类的作用域 二、类的实例化 三、类对象模型 四、this指针 1、this指针的引出 2 this指针的特…

机械转行网络安全自学经历,零基础学网络安全,血泪总结的干货

机械转行网络安全自学经历&#xff0c;零基础学网络安全&#xff0c;血泪总结的干货 我为什么转行.转行之路面试之路自学路上的学习资源 求职路上亦是如此&#xff0c;打开这篇文章&#xff0c;相信你也有转行的想法。和身边的朋友聊过&#xff0c;入职后的他们&#xff0c;或…

linux 内存寻址

&#xff08;持续更新&#xff09; 相关概念 查看的书籍为 深入linux内核 内存地址 当使用80x86&#xff08;32位&#xff09;微处理器时&#xff0c;一般分为三种不同的地址&#xff1a; 逻辑地址 包含在机器语言指令中用来指定一个操作数或一条指令的地址。每一个逻辑地址…

踩了一堆坑,终于掌握了postgreSQL主从流的精髓

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