前言
今天遇到了一個(gè)bug,大概就是數(shù)據(jù)庫(kù)(Mysql)中有一個(gè)type
類型字段,數(shù)據(jù)類型為json,大概是這樣的:[“蘋果”,“香蕉”,“葡萄”]的數(shù)據(jù)格式,這個(gè)bug的問題所在呢就是查詢后這個(gè)json格式的數(shù)據(jù)無(wú)法映射到我們實(shí)體類的屬性上,解決方案如下:
解決
實(shí)體類的配置:
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實(shí)體類中對(duì)應(yīng)的字段的類型處理器。在這個(gè)例子中,使用了JacksonTypeHandler
來(lái)處理JSONArray
類型的數(shù)據(jù)。
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
屬性用于設(shè)置字段映射時(shí)的類型處理器。com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler是MyBatis-Plus提供的一個(gè)針對(duì)Jackson庫(kù)的類型處理器,用于處理Java對(duì)象和JSON字符串的相互轉(zhuǎn)換
。在代碼中,這個(gè)類型處理器被用于處理type字段,將JSON字符串轉(zhuǎn)換成Java對(duì)象。
查詢語(yǔ)句:
@Override
public User selectById(String id) {
return userMapper.selectById(id);
}
注:如果你在上面的查詢語(yǔ)句中使用的是在Mybatis的查詢方式,并且返回的類型指定的是resultMap,那么下面的報(bào)錯(cuò)你就不用看了。
然后我們測(cè)試一下,你會(huì)發(fā)現(xiàn),它?還是返回的null,數(shù)據(jù)庫(kù)可以正常查出來(lái)數(shù)據(jù),但在代碼中字段就是映射不上,本以為是JacksonTypeHandler
轉(zhuǎn)換的時(shí)候出了問題,我在這里深陷了兩個(gè)小時(shí)才找到問題原因。
解決方法
1 我們只需要在實(shí)體類中加上@TableName(value = "user", autoResultMap = true)
后面的autoResultMap 即可。
2 或者可以使用@TableName(value = "user", resultMap= "xml文件中resultMap標(biāo)簽的id值")
。
注:配置了typeHandler屬性的映射字段需要在該標(biāo)簽里面
問題原因
@TableName 注解用于指定實(shí)體類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名,value 屬性表示表名,autoResultMap 屬性表示是否開啟自動(dòng)生成 resultMap,默認(rèn)為 false
,表示不開啟。
當(dāng) autoResultMap 為 true 時(shí),MyBatis-Plus 會(huì)在啟動(dòng)時(shí)自動(dòng)根據(jù)表結(jié)構(gòu)生成對(duì)應(yīng)的 resultMap。如果沒有指定 resultMap 或 resultType 屬性,會(huì)使用自動(dòng)生成的 resultMap 進(jìn)行結(jié)果映射。
例如 ,使用 @TableName(value = “user”, autoResultMap = true) 注解標(biāo)記一個(gè)實(shí)體類,表示該類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名為 user,并開啟自動(dòng)生成 resultMap。那么在執(zhí)行查詢時(shí),如果該查詢的返回值是該實(shí)體類的列表,那么 MyBatis-Plus 會(huì)自動(dòng)使用自動(dòng)生成的 resultMap 進(jìn)行結(jié)果映射。
原因總結(jié)
總的問題原因就是,我們使用MP內(nèi)置的查詢方法返回是沒有指定resultMap標(biāo)簽里的typeHandler轉(zhuǎn)換的
,所以在實(shí)體類中配置了轉(zhuǎn)換只會(huì)在添加的時(shí)候有效果,查詢的時(shí)候是映射不到的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-616248.html
BUG總結(jié)
坑爹!再也不用plus了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-616248.html
到了這里,關(guān)于【Java】Mybatis查詢數(shù)據(jù)庫(kù)返回JSON格式的字段映射到實(shí)體類屬性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!