【Java】Mybatis查询数据库返回JSON格式的字段映射到实体类属性

前言

今天遇到了一个bug,大概就是数据库(Mysql)中有一个type类型字段,数据类型为json,大概是这样的:[“苹果”,“香蕉”,“葡萄”]的数据格式,这个bug的问题所在呢就是查询后这个json格式的数据无法映射到我们实体类的属性上,解决方案如下:

解决

实体类的配置:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;

@TableField(typeHandler = JacksonTypeHandler.class)
private JSONArray type;

@TableField(typeHandler = JacksonTypeHandler.class)是MyBatis-Plus的注解,它用于指定Java实体类中对应的字段的类型处理器。在这个例子中,使用了JacksonTypeHandler来处理JSONArray类型的数据。

XML文件配置:

<resultMap id="defaultResultMap" type="xx.xx.model.User">
	<result property="type" column="type" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap>

在MyBatis-Plus中,typeHandler属性用于设置字段映射时的类型处理器。com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler是MyBatis-Plus提供的一个针对Jackson库的类型处理器,用于处理Java对象和JSON字符串的相互转换。在代码中,这个类型处理器被用于处理type字段,将JSON字符串转换成Java对象。

查询语句:

@Override
public User selectById(String id) {
	return userMapper.selectById(id);
}

注:如果你在上面的查询语句中使用的是在Mybatis的查询方式,并且返回的类型指定的是resultMap,那么下面的报错你就不用看了。

然后我们测试一下,你会发现,它™还是返回的null,数据库可以正常查出来数据,但在代码中字段就是映射不上,本以为是JacksonTypeHandler转换的时候出了问题,我在这里深陷了两个小时才找到问题原因。

解决方法

1 我们只需要在实体类中加上@TableName(value = "user", autoResultMap = true)后面的autoResultMap 即可。

2 或者可以使用@TableName(value = "user", resultMap= "xml文件中resultMap标签的id值")
:配置了typeHandler属性的映射字段需要在该标签里面

问题原因

@TableName 注解用于指定实体类对应的数据库表名,value 属性表示表名,autoResultMap 属性表示是否开启自动生成 resultMap,默认为 false,表示不开启。

当 autoResultMap 为 true 时,MyBatis-Plus 会在启动时自动根据表结构生成对应的 resultMap。如果没有指定 resultMap 或 resultType 属性,会使用自动生成的 resultMap 进行结果映射。

例如 ,使用 @TableName(value = “user”, autoResultMap = true) 注解标记一个实体类,表示该类对应的数据库表名为 user,并开启自动生成 resultMap。那么在执行查询时,如果该查询的返回值是该实体类的列表,那么 MyBatis-Plus 会自动使用自动生成的 resultMap 进行结果映射。

原因总结

总的问题原因就是,我们使用MP内置的查询方法返回是没有指定resultMap标签里的typeHandler转换的,所以在实体类中配置了转换只会在添加的时候有效果,查询的时候是映射不到的。

BUG总结

坑爹!再也不用plus了

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值