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