MyBatis-Plus實現(xiàn)優(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)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Maven編譯錯誤:程序包com.sun.*包不存在的三種解決方案
J2SE中的類大致可以劃分為以下的各個包:java.*,javax.*,org.*,sun.*,本文文章主要介紹了maven編譯錯誤:程序包com.sun.xml.internal.ws.spi不存在的解決方案,感興趣的可以了解一下2024-02-02Java面試題沖刺第十二天--數(shù)據(jù)庫(2)
這篇文章主要為大家分享了最有價值的三道數(shù)據(jù)庫面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-07-07SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn)
Prometheus作為一個開源的監(jiān)控和告警工具,以其強大的數(shù)據(jù)采集、存儲和查詢能力,受到了眾多開發(fā)者的青睞,本文主要介紹了SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn),感興趣的可以了解一下2024-07-07Spring中的singleton和prototype的實現(xiàn)
這篇文章主要介紹了Spring中的singleton和prototype的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07