解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問(wèn)題
踩坑背景
需求
將實(shí)體類(lèi)中的JSONObject對(duì)象與MySQL數(shù)據(jù)庫(kù)中VARCHAR類(lèi)型進(jìn)行映射
//實(shí)體類(lèi)
@TableName(autoResultMap = true)
@Data
public class ImportItem implements Serializable {
...
@ExcelIgnore
@TableField(typeHandler = Fastjson2TypeHandler.class , value = "dynamic_information")
private JSONObject dynamicInformation;
...
}
//自定義類(lèi)Fastjson2TypeHandler
@MappedTypes({JSONObject.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class Fastjson2TypeHandler extends AbstractJsonTypeHandler<JSONObject> {
private static final Logger log = LoggerFactory.getLogger(Fastjson2TypeHandler.class);
private final Class<JSONObject> type = JSONObject.class;
public Fastjson2TypeHandler() {
log.trace("Fastjson2TypeHandler({})", type);
}
@Override
protected JSONObject parse(String json) {
return JSON.parseObject(json, this.type);
}
@Override
protected String toJson(JSONObject obj) {
return obj != null ? obj.toJSONString() : null;
}
}
//自定義查詢語(yǔ)句
public interface ImportItemMapper extends MyMapper<ImportItem> {
@Select("<script>"
+ "SELECT * from import_item \n"
+ "WHERE company_id=#{companyId} \n"
+ "<if test='batchNumber!= null and batchNumber!=\"\" '>AND batch_number=#{batchNumber}</if> \n"
+ "<if test='mark!= null'>AND mark=#{mark}</if> \n"
+ "${params.dataScope}"
+ "</script>")
List<ImportItem> getByBatchNumber(ItemQuery itemQuery);
}
此時(shí)在操作的時(shí)候增刪改都沒(méi)為問(wèn)題,但是調(diào)用自定義的查詢接口的時(shí)候dynamicInformation始終查詢結(jié)果為空,通過(guò)開(kāi)啟Mybatis-plus日志打印發(fā)現(xiàn)sql查詢結(jié)果是正常的,因此判斷是自定義的Fastjson2TypeHandler沒(méi)有生效。
問(wèn)題排查
1、實(shí)體類(lèi)注解
@TableName(autoResultMap = true)
2、需要映射處理的字段需要添加注解
@TableField(typeHandler = Fastjson2TypeHandler.class , value = "dynamic_information") private JSONObject dynamicInformation;
3、各種路徑問(wèn)題,字段拼寫(xiě)排查確保正確
4、可以嘗試xml中resultMap使用 typeHandler 屬性
此時(shí)問(wèn)題依舊存在,于是懷疑ImportItemMapper接口問(wèn)題,由于之前一直沒(méi)有使用xml文件,于是決定嘗試使用xml
public interface ImportItemMapper extends MyMapper<ImportItem> {
List<ImportItem> getByBatchNumber(ItemQuery itemQuery);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.plm.mapper.ImportItemMapper">
<resultMap id="BaseResultMap" type="com.ruoyi.plm.model.entity.ImportItem">
<id column="dynamic_information" jdbcType="VARCHAR" property="dynamicInformation" typeHandler="com.ruoyi.plm.util.Fastjson2TypeHandler"/>
</resultMap>
<select id="getByBatchNumber" resultMap="BaseResultMap" parameterType="com.ruoyi.system.api.model.plm.ItemQuery">
SELECT *
FROM import_item
WHERE company_id = #{companyId}
<if test="batchNumber != null and !batchNumber.isEmpty()">
AND batch_number = #{batchNumber}
</if>
<if test="mark != null">
AND mark = #{mark}
</if>
${params.dataScope}
</select>
</mapper>
此時(shí)再次嘗試后發(fā)現(xiàn)問(wèn)題已經(jīng)解決,既然這種方式可以解決問(wèn)題,那么很有可能是因?yàn)樽远x TypeHandler 沒(méi)能正確注冊(cè)到 MyBatis,因此可以嘗試放棄使用xml選則最后一種方式
5、 注冊(cè)自定義TypeHandler到 MyBatis
@Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer mybatisConfigurationCustomizer() {
return configuration -> {
// 注冊(cè)自定義 TypeHandler
configuration.getTypeHandlerRegistry().register(JSONObject.class, JdbcType.VARCHAR, new Fastjson2TypeHandler());
};
}
}
經(jīng)測(cè)試注冊(cè)后結(jié)合注解自定義sql語(yǔ)句查詢一切正常,問(wèn)題完美解決。
總結(jié)
出現(xiàn)增刪改數(shù)據(jù)正常,但查詢結(jié)果為null,很有可能是自定義的TypeHandler未生效,可以參考上述4或5的方法來(lái)解決問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MyBatis自定義TypeHandler實(shí)現(xiàn)字段加密解密
- MyBatis類(lèi)型處理器TypeHandler的作用及說(shuō)明
- MyBatis中TypeHandler的使用教程詳解
- MyBatis-Plus?中?typeHandler?的使用實(shí)例詳解
- SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
- Mybatis中TypeHandler使用小結(jié)
- Mybatis的TypeHandler實(shí)現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- MyBatisPlus自定義JsonTypeHandler實(shí)現(xiàn)自動(dòng)轉(zhuǎn)化JSON問(wèn)題
- MyBatis自定義TypeHandler如何解決字段映射問(wèn)題
- MyBatis中TypeHandler基本用法與示例
相關(guān)文章
java ReentrantLock條件鎖實(shí)現(xiàn)原理示例詳解
這篇文章主要為大家介紹了java ReentrantLock條件鎖實(shí)現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
springboot 中 inputStream 神秘消失之謎(終破)
這篇文章主要介紹了springboot 中 inputStream 神秘消失之謎,為了能夠把這個(gè)問(wèn)題說(shuō)明,我們首先需要從簡(jiǎn)單的http調(diào)用說(shuō)起,通過(guò)設(shè)置body等一些操作,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-08-08
spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行
這篇文章主要介紹了spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行呢,主要講述將SpringBoot打成war包并放入tomcat中運(yùn)行的方法分享,需要的朋友可以參考下2022-11-11
SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程
這篇文章給大家介紹了SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01
詳談Map的key、value值的數(shù)據(jù)類(lèi)型不能為基本類(lèi)型的原因
這篇文章主要介紹了詳談Map的key、value值的數(shù)據(jù)類(lèi)型不能為基本類(lèi)型的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
SpringBoot配置多個(gè)數(shù)據(jù)源超簡(jiǎn)單步驟(連接多個(gè)數(shù)據(jù)庫(kù))
公司項(xiàng)目有連接多個(gè)不同數(shù)據(jù)庫(kù)的需求,特研究了一下,根據(jù)網(wǎng)上的資料,這篇文章主要給大家介紹了關(guān)于SpringBoot配置多個(gè)數(shù)據(jù)源(連接多個(gè)數(shù)據(jù)庫(kù))的相關(guān)資料,需要的朋友可以參考下2024-05-05
SpringBoot項(xiàng)目部署到服務(wù)器的兩種方式
目前,前后端分離的架構(gòu)已成主流,而使用SpringBoot構(gòu)建Web應(yīng)用是非??焖俚?項(xiàng)目發(fā)布到服務(wù)器上的時(shí)候,只需要打成一個(gè)jar包,然后通過(guò)命令 : java -jar jar包名稱(chēng)即可啟動(dòng)服務(wù)了,本文介紹了SpringBoot項(xiàng)目部署到服務(wù)器的兩種方式,需要的朋友可以參考下2024-10-10

