前言
今天遇到了一个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了