场景解决之mybatis当中resultType= map时,因某个字段为null导致返回的map的key不存在怎么处理

news/2024/11/17 2:31:38/

1、场景:通过查询数据表将返回结果封装到map当中返回,因某个字段为null,导致map当中key丢失

<select id="queryMyBonus" parameterType="com.cn.entity.student" resultType= "map">SELECTb.projectName as "projectName",b.money as "money",b.yearMonthDay as "yearMonthDay",b.description as "description"FROMStudent b<where><if test='userId != null and userId != ""'>AND b.USERID = #{userId,jdbcType=VARCHAR}</if></where>order by b.YEARMONTHDAY desc, b.totalFlag desc, b.BONUSID asc</select>

注意上面的resultType= “map”,此时当查询结果为
在这里插入图片描述
返回的map结果为,丢失了description
在这里插入图片描述
2、解决方案

  1. 修改查询SQL:在查询SQL中使用数据库函数(如 IFNULL 或 COALESCE )来为可能为 null 的字段提供一个默认值。
  2. 使用实体类代替Map:如果可能,修改返回类型为一个实体类而不是 map ,这样即使字段值为 null ,也会在实体类中正确地表示出来。
  3. 配置MyBatis:在MyBatis的配置文件中设置 callSettersOnNulls 属性为 true 。这会使得MyBatis在处理结果集时,即使字段值为 null 也会调用映射对象的setter方法(对于 map 来说就是 put 方法),从而在 map 中包含这个键。在 mybatis-config.xml 中添加如下配置
<configuration><settings><!--  这个修改是全局的 --><setting name="callSettersOnNulls" value="true"/></settings>
</configuration>

如果是Spring Boot项目,可以在 application.properties 或 application.yml 中添加:
properties:

mybatis.configuration.call-setters-on-nulls=true

yaml:

mybatis:configuration:call-setters-on-nulls: true
  1. 自定义TypeHandler:创建一个实现 TypeHandler 接口的类,用于处理 null 值的情况。
/*** 自定义类型处理器,用于将数据库中的null值转换为空字符串* 这在避免空指针异常和统一数据处理逻辑方面非常有用*/
package com.cn.config;import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class EmptyStringIfNull implements TypeHandler<String> {/*** 设置参数值到PreparedStatement中* 本方法暂未实现,因为在这种情况下不需要特殊处理** @param ps          预编译的SQL语句对象* @param i           参数索引* @param parameter   参数值* @param jdbcType    JDBC类型* @throws SQLException 如果操作数据库时发生错误*/@Overridepublic void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {// 无需特殊处理,保留默认行为}/*** 从ResultSet中根据列名获取结果,并将null值转换为空字符串* 这是处理null值的关键方法** @param rs          结果集对象* @param columnName  列名* @return            字符串结果,如果数据库中的值为null,则返回空字符串* @throws SQLException 如果操作数据库时发生错误*/@Overridepublic String getResult(ResultSet rs, String columnName) throws SQLException {// 获取字符串值,如果为null,则返回空字符串return (rs.getString(columnName) == null) ? "" : rs.getString(columnName);}/*** 从ResultSet中根据列索引获取结果* 本方法未实现,因为当前逻辑不需要使用列索引获取结果** @param rs          结果集对象* @param columnIndex 列索引* @return            未使用,始终返回null* @throws SQLException 如果操作数据库时发生错误*/@Overridepublic String getResult(ResultSet rs, int columnIndex) throws SQLException {// 无需处理,返回nullreturn null;}/*** 从CallableStatement中根据列索引获取结果* 本方法未实现,因为当前逻辑不需要通过CallableStatement获取结果** @param cs          可调用语句对象* @param columnIndex 列索引* @return            未使用,始终返回null* @throws SQLException 如果操作数据库时发生错误*/@Overridepublic String getResult(CallableStatement cs, int columnIndex) throws SQLException {// 无需处理,返回nullreturn null;}
}

使用方式:
将select标签的resulttype=map 改成resultMap映射

 <!-- 查询信息 --><resultMap id="BonusResultMap" type="map"><result property="projectName" column="projectName"/><result property="money" column="money"/><result property="yearMonthDay" column="yearMonthDay"/><result property="description" column="description" typeHandler="com.cn.config.EmptyStringIfNull"/></resultMap>

上述配置 typeHandler=“com.cn.config.EmptyStringIfNull”
可以单个指定使用较为方便

结果验证:
在这里插入图片描述


http://www.ppmy.cn/news/1547598.html

相关文章

windows二进制安全零基础(二)

文章目录 栈&#xff08;The Stack&#xff09;调用约定&#xff08;Calling Conventions&#xff09;函数返回机制 在x86架构中&#xff0c;栈&#xff08;Stack&#xff09;是一个非常重要的内存区域&#xff0c;它用于支持线程的短期数据需求&#xff0c;如函数调用、局部变…

第8章利用CSS制作导航菜单

8.1 水平顶部导航栏 8.1.1 简单水平导航栏的设计与实现 8.1.1.1导航栏的创建 <nav>标签是 HIML5 新增的文档结构标签&#xff0c;用于标记导航栏&#xff0c;以便后续与网站的其他内整合&#xff0c;所以常用<nav>标签在页面上创建导航栏菜单区域。 例如,在<na…

【移除bpmn-js流程图中的logo图标】

在node_modules文件中查找 bpmn-js\dist\bpmn-modeler.development.js bpmn-js\lib\BaseViewer.js在文件中搜索linkMarkup var linkMarkup <a href"http://bpmn.io" target"_blank" class"bjs-powered-by" title"Powered by bpmn.i…

浅谈“通感一体”

文章目录 5G_Advanced的关键技术通感一体的介绍通感一体应用通感一体面临的挑战 5G_Advanced的关键技术 2024年6月18日16点30分&#xff0c;在上海举行的3GPP RAN第104次会议上&#xff0c;R18标准正式冻结&#xff0c;标志着5G技术的又一重要里程碑。值得注意的是&#xff0c…

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…

栈相关算法实现详解

目录 STLstack 栈的简单应用举例 手写栈 单调栈 STLstack stack<Type>s//定义栈&#xff0c;Type为数据类型 s.push(item)//把item放入栈顶 s.top()//返回栈顶的元素&#xff0c;但不会删除 s.pop()//删除栈顶的元素&#xff0c;但不会返回。在出站时需要执行两步操…

Python网络爬虫简介

Python网络爬虫简介 网络爬虫(Web Crawler),又称为网络蜘蛛(Web Spider),是一种自动化程序,能够在互联网上自动抓取、分析和收集数据。Python作为一种简洁、易读且功能强大的编程语言,非常适合用于编写网络爬虫。其丰富的库和工具,如 requests 、 BeautifulSoup 、…

大数据学习15之Scala集合与泛型

1. 概述 大部分编程语言都提供了数据结构对应的编程库&#xff0c;并称之为集合库(Collection Library)&#xff0c;Scala 也不例外&#xff0c;且它还拥有以下优点&#xff1a; 易用&#xff1a;灵活组合运用集合库提供的方法&#xff0c;可以解决大部分集合问题 简洁&#xf…