前言

今天遇到了一个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对象。

查询语句:

@Overridepublic 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了