Mybatis在SpringBoot中返回null字段问题

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
    ]
}

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 MyBatis Plus 在 Spring Boot 非常简单。下面是一些基本步骤: 1. 添加 MyBatis Plus 依赖 在 pom.xml 文件添加 MyBatis Plus 依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 配置数据源 在 application.properties 或 application.yml 配置数据源: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver ``` 3. 定义实体类 定义一个实体类,并使用 MyBatis Plus 的注解来映射数据库表和字段: ```java @TableField(exist = false) public class User { @TableId(type = IdType.AUTO) private Long id; @TableField("name") private String name; @TableField("age") private Integer age; // getter 和 setter } ``` 4. 定义 Mapper 接口 定义一个 Mapper 接口,并继承 BaseMapper 接口: ```java public interface UserMapper extends BaseMapper<User> { } ``` 5. 使用 MyBatis Plus 使用 MyBatis Plus 提供的 API 进行数据操作: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> getUserList() { return userMapper.selectList(null); } @Override public User getUserById(Long id) { return userMapper.selectById(id); } @Override public boolean addUser(User user) { return userMapper.insert(user) > 0; } @Override public boolean updateUser(User user) { return userMapper.updateById(user) > 0; } @Override public boolean deleteUser(Long id) { return userMapper.deleteById(id) > 0; } } ``` 以上就是使用 MyBatis Plus 在 Spring Boot 的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值