Mybatis中resultType为map时,null值的字段不返回

问题描述

1 <select id="getUser" parameterType="map" resultType="map">
2         SELECT
3            id, name, addr
4         FROM
5            user
6          WHERE
7            id = #{id}  
8 </select>

以上查询,当addr字段值在数据库中为null时,返回的结果如下:

1 {
2 "id": 1,
3 "name": "test"
4 }

正常我们想要的应该是这样:

1 {
2 "id": 1,
3 "name": "test",
4 "addr": null
5 }

将null值变成空字符串。不完美,无法区分null和‘’。

复制代码
 1 SELECT
 2 id,name,
 3 case when addr is not null
 4 then addr
 5 else ''
 6 end addr
 7 FROM
 8 user
 9 WHERE
10 id = #{id}
复制代码

前期描述:

Mybatis早前的版本(如3.1.2)的设计中,如果一个结果集中的字段返回值是null,那么就不会给字段设置值,如果返回的是Map作为结果集接收对象,那么Map中不会包含null的字段。

在后期的版本中,如果是开启自动映射配置(默认autoMappingBehavior只要不是NONE,默认即可),自动映射时只要返回值不是原始数据类型(boolean,int等等)且返回值为null,那么字段就设置为null,如果结果集是map,空值字段照样返回;

如果没有开启自动映射的情况下,返回值不是原始数据类型且返回值为null时,如果开启了callSettersOnNulls为true,就会返回空的键值,默认是false,不会返回。

解决办法:

1. 修改Mybatis返回值类型(resultType=""),使用实体类进行接收

2. 对于springboot集成.mybatis/mybatisplus配置,修改sqlSessionFactory的配置

1 MybatisConfiguration configuration = new MybatisConfiguration();        
2 configuration.setCallSettersOnNulls(true);
3 sqlSessionFactory.setConfiguration(configuration);

3.在mybatis-config配置文件中加上

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  
3     "http://mybatis.org/dtd/mybatis-3-config.dtd">
4 <configuration>
5     
6     <settings> 
7         <setting name="callSettersOnNulls" value="true"/>
8     </settings>

或者

mybatis:
  configuration:
    call-setters-on-nulls: true

使用了 mybatis-plus的 配置

mybatis-plus:
  configuration:
    call-setters-on-nulls: true

————————————————

版权声明:本文为CSDN博主「睡眠不足z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lq2016510/article/details/108831318

posted on   天军  阅读(1829)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示