1.前言
Mybatis在返回处理字段为null的时候,会忽略这个字段。导致返回的数据结构不同。前端在渲染遍历时候会抛
出NullPointerException错误。
注意:
用实体类接收不会发生这个问题,用map接收返回的数据会存在这个问题。
2.测试用实体类接收--不会出现过滤null字段问题
1 张三 NULL
2 李四 19
3 王五 20
4 司总 NULL
这是数据库模拟的四条数据
List<TUser> findUserAll();
<select id="findUserAll" resultType="com.ldd.ratelblog.bean.TUser">
select
id,
name,
age
from t_user
</select>
{
"msg": "",
"code": 200,
"data": [
{
"id": 1,
"name": "张三",
"age": null
},
{
"id": 2,
"name": "李四",
"age": 19
},
{
"id": 3,
"name": "王五",
"age": 20
},
{
"id": 4,
"name": "司总",
"age": null
}
]
}
我们看到age字段null也正常返回,并没有打乱这个数据的格式。
3.测试用Map接收--会出现过滤null字段问题
1 张三 NULL
2 李四 19
3 王五 20
4 司总 NULL
这是数据库模拟的四条数据
List<Map<String,Object>> findUserAll();
<resultMap id="userMap" type="java.util.HashMap">
<id property="id" column="id" />
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="findUserAll" resultMap="userMap">
select
id,
name,
age
from t_user
</select>
{
"msg": "",
"code": 200,
"data": [
{
"name": "张三",
"id": 1
},
{
"name": "李四",
"id": 2,
"age": 19
},
{
"name": "王五",
"id": 3,
"age": 20
},
{
"name": "司总",
"id": 4
}
]
}
注意:
我们看到使用Map接收时,存在age为null过滤的一个问题,这样会导致数据结构的不同,前端在处理时容易出现
Null异常。
4.解决Map接收--会出现过滤null字段问题
1.在SpringBoot的yml文件中添加如下配置
mybatis:
configuration:
call-setters-on-nulls: true
2.在mybatis-config.xml文件添加如下配置
<setting name="callSettersOnNulls" value="true"/>
作用:
在一般查询中,如果用map接受查询结果时,会自动将查询结果为null的字段忽略,这样就造成取参数时报空
指针异常的情况。
如果设置了这条属性之后,mybatis就不会忽略这些字段,你依然能get到这些key,只不过value为null,这
样也方便。
{
"msg": "",
"code": 200,
"data": [
{
"name": "张三",
"id": 1,
"age": null
},
{
"name": "李四",
"id": 2,
"age": 19
},
{
"name": "王五",
"id": 3,
"age": 20
},
{
"name": "司总",
"id": 4,
"age": null
}
]
}
添加完成后,我们测试发现数据已经恢复正常格式。
这种设置的情况下,会出现比较特殊的情况。
如果只查询一个字段,而用map接收,此时为null是什么结果?
<resultMap id="userMap" type="java.util.HashMap">
<id property="id" column="id" />
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="findUserAll" resultMap="userMap">
select
age
from t_user
where id = 1
</select>
答案是,我们会接收到一个为null的map。
{
"msg": "",
"code": 200,
"data": [
null
]
}