欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis-Plus實現(xiàn)優(yōu)雅處理JSON字段映射

 更新時間:2025年04月22日 09:06:47   作者:William Dawson  
默認情況下,MyBatis-Plus 是不支持直接映射 JSON 類型的,這時候就需要借助其他的方法,下面小編就來和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧

在使用 MyBatis-Plus 進行業(yè)務(wù)開發(fā)時,我們時常需要把數(shù)據(jù)庫中的 JSON 字段(比如字符串形式的數(shù)組)自動映射成 Java 中的 JSONArray 或 List<String> 類型。

默認情況下,MyBatis-Plus 是不支持直接映射 JSON 類型的,這時候就需要借助:

  • @TableField(typeHandler = ...)
  • 自定義或已有的 TypeHandler
  • 配合 @TableName(autoResultMap = true) 才能正確生效!

真實場景舉例

假設(shè)我們現(xiàn)在有一個旅游美食表 travel_cuisine,里面的字段 tag_list 是一個 JSON Array,用來存儲標簽 ID 列表,示例數(shù)據(jù)如下:

["tag-101", "tag-202", "tag-333"]

我們希望在 Java 實體中使用如下形式自動映射:

@TableField(typeHandler = JsonArrayTypeHandler.class)
private JSONArray tagList;

接下來,教你一步步實現(xiàn)它。

一、@TableField + typeHandler 是什么?

@TableField 簡介

@TableField 是 MyBatis-Plus 提供的字段級注解,用于說明字段與數(shù)據(jù)庫的映射關(guān)系。

核心參數(shù)如下:

參數(shù)說明
value對應(yīng)數(shù)據(jù)庫字段名
exist字段是否存在于數(shù)據(jù)庫表結(jié)構(gòu)中
typeHandler字段轉(zhuǎn)換處理器,用于復雜類型映射

typeHandler 作用

TypeHandler 是 MyBatis 中的一個重要機制,它負責Java 類型 和 JDBC 類型之間的轉(zhuǎn)換。

你可以用它來處理:

  • JSON ↔ Java 對象(如 JSONArray、Map、List)
  • 逗號分隔字符串 ↔ List
  • 枚舉 ↔ 數(shù)據(jù)庫存儲值

簡單來說,typeHandler 就是數(shù)據(jù)格式的橋梁!

二、@TableName(autoResultMap = true) 必須開啟

默認情況下,MyBatis-Plus 的字段映射并不會使用 typeHandler,除非你在實體類加上:

@TableName(value = "travel_cuisine", autoResultMap = true)

autoResultMap 是什么?

這是告訴 MP:“請生成自定義的 ResultMap,否則我不支持 typeHandler 和復雜類型的轉(zhuǎn)換!”

如果你忘記加這一項,typeHandler 是不會生效的!

三、實戰(zhàn)代碼:映射 JSON 字段為 JSONArray

1.數(shù)據(jù)庫建表語句(簡化版)

CREATE TABLE travel_cuisine (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100),
  tag_list TEXT -- JSON Array 字符串
);

2.實體類配置

@Data
@TableName(value = "travel_cuisine", autoResultMap = true)
public class TravelCuisineDO {

    private Long id;

    private String name;

    @TableField(typeHandler = JsonArrayTypeHandler.class)
    private JSONArray tagList;
}

3.自定義 TypeHandler(基于 FastJSON)

public class JsonArrayTypeHandler extends BaseTypeHandler<JSONArray> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toJSONString());
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String result = rs.getString(columnName);
        return JSON.parseArray(result);
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String result = rs.getString(columnIndex);
        return JSON.parseArray(result);
    }

    @Override
    public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String result = cs.getString(columnIndex);
        return JSON.parseArray(result);
    }
}

提醒:這個 JsonArrayTypeHandler 使用的是 FastJSON,如需 Jackson,請更換轉(zhuǎn)換邏輯。

四、常見問題排查指南

問題現(xiàn)象解決方法或建議
typeHandler 沒有生效檢查實體類是否開啟 autoResultMap = true
報 JSON parse error確保數(shù)據(jù)庫字段是真正的 JSON 格式
存儲時字段為 null確認字段不是 transient,且未被忽略
想用 List<String> 代替 JSONArray寫一個 ListStringTypeHandler 即可

總結(jié):三件事必須配套使用

配置項說明
@TableField(typeHandler = …)標記字段轉(zhuǎn)換器
@TableName(autoResultMap = true)告訴 MP 啟用復雜映射
自定義 TypeHandler將 JSON 字段與 Java 類型進行互轉(zhuǎn)

到此這篇關(guān)于MyBatis-Plus實現(xiàn)優(yōu)雅處理JSON字段映射的文章就介紹到這了,更多相關(guān)MyBatis-Plus處理JSON字段映射內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot 使用yml配置文件給靜態(tài)變量賦值教程

    springboot 使用yml配置文件給靜態(tài)變量賦值教程

    這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Maven編譯錯誤:程序包com.sun.*包不存在的三種解決方案

    Maven編譯錯誤:程序包com.sun.*包不存在的三種解決方案

    J2SE中的類大致可以劃分為以下的各個包:java.*,javax.*,org.*,sun.*,本文文章主要介紹了maven編譯錯誤:程序包com.sun.xml.internal.ws.spi不存在的解決方案,感興趣的可以了解一下
    2024-02-02
  • Java編程實現(xiàn)swing圓形按鈕實例代碼

    Java編程實現(xiàn)swing圓形按鈕實例代碼

    這篇文章主要介紹了Java編程實現(xiàn)swing圓形按鈕實例代碼,涉及兩個簡單的Java實現(xiàn)按鈕的代碼,其中一個具有偵測點擊事件的簡單功能,具有一定借鑒價值,需要的朋友可以參考。
    2017-11-11
  • 這一次搞懂SpringMVC原理說明

    這一次搞懂SpringMVC原理說明

    這篇文章主要介紹了這一次搞懂SpringMVC原理說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JPA使用樂觀鎖應(yīng)對高并發(fā)方式

    JPA使用樂觀鎖應(yīng)對高并發(fā)方式

    這篇文章主要介紹了JPA使用樂觀鎖應(yīng)對高并發(fā)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java面試題沖刺第十二天--數(shù)據(jù)庫(2)

    Java面試題沖刺第十二天--數(shù)據(jù)庫(2)

    這篇文章主要為大家分享了最有價值的三道數(shù)據(jù)庫面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn)

    SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn)

    Prometheus作為一個開源的監(jiān)控和告警工具,以其強大的數(shù)據(jù)采集、存儲和查詢能力,受到了眾多開發(fā)者的青睞,本文主要介紹了SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn),感興趣的可以了解一下
    2024-07-07
  • Java中的異常處理之try-catch使用詳解

    Java中的異常處理之try-catch使用詳解

    這篇文章主要介紹了Java中的異常處理之try-catch使用的相關(guān)資料,包括異常的概念、try-catch語句的基本結(jié)構(gòu)、使用示例、多個catch塊的使用、try-catch-finally的執(zhí)行順序、try-with-resources語句以及總結(jié),需要的朋友可以參考下
    2024-12-12
  • Spring中的singleton和prototype的實現(xiàn)

    Spring中的singleton和prototype的實現(xiàn)

    這篇文章主要介紹了Spring中的singleton和prototype的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java生成CSV文件實例詳解

    Java生成CSV文件實例詳解

    這篇文章主要介紹了Java生成CSV文件的方法,很實用的功能,需要的朋友可以參考下
    2014-07-07

最新評論