设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间04 现在时间04 缓存数据 十七岁吻的人额头没有粉底

十七岁吻的人额头没有粉底 -- 十七岁

查看: 670|回复: 0

MyBatis-Plus实现优雅处理JSON字段映射

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:16
  • 最近打卡:2025-03-18 15:35:29
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
31
主题
25
精华
0
金钱
110
积分
62
注册时间
2023-9-30
最后登录
2025-5-31

发表于 2025-5-31 05:58:08 | 显示全部楼层 |阅读模式

在使用 MyBatis-Plus 进行业务开发时,我们时常需要把数据库中的 JSON 字段(比如字符串形式的数组)自动映射成 Java 中的 JSONArray 或 List 类型。

默认情况下,MyBatis-Plus 是不支持直接映射 JSON 类型的,这时候就需要借助:

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

真实场景举例

假设我们现在有一个旅游美食表 travel_cuisine,里面的字段 tag_list 是一个 JSON Array,用来存储标签 ID 列表,示例数据如下:

  1. ["tag-101", "tag-202", "tag-333"]
复制代码

我们希望在 Java 实体中使用如下形式自动映射:

  1. @TableField(typeHandler = JsonArrayTypeHandler.class)
  2. private JSONArray tagList;
复制代码

接下来,教你一步步实现它。

一、@TableField + typeHandler 是什么?

@TableField 简介

@TableField 是 MyBatis-Plus 提供的字段级注解,用于说明字段与数据库的映射关系。

核心参数如下:

参数说明
  1. value
复制代码
对应数据库字段名
  1. exist
复制代码
字段是否存在于数据库表结构中
  1. typeHandler
复制代码
字段转换处理器,用于复杂类型映射

typeHandler 作用

TypeHandler 是 MyBatis 中的一个重要机制,它负责Java 类型 和 JDBC 类型之间的转换。

你可以用它来处理:

  • JSON ↔ Java 对象(如 JSONArray、Map、List)
  • 逗号分隔字符串 ↔ List
  • 枚举 ↔ 数据库存储值

简单来说,typeHandler 就是数据格式的桥梁!

二、@TableName(autoResultMap = true) 必须开启

默认情况下,MyBatis-Plus 的字段映射并不会使用 typeHandler,除非你在实体类加上:

  1. @TableName(value = "travel_cuisine", autoResultMap = true)
复制代码

autoResultMap 是什么?

这是告诉 MP:“请生成自定义的 ResultMap,否则我不支持 typeHandler 和复杂类型的转换!”

如果你忘记加这一项,typeHandler 是不会生效的!

三、实战代码:映射 JSON 字段为 JSONArray

1.数据库建表语句(简化版)

  1. CREATE TABLE travel_cuisine (
  2. id BIGINT PRIMARY KEY AUTO_INCREMENT,
  3. name VARCHAR(100),
  4. tag_list TEXT -- JSON Array 字符串
  5. );
复制代码

2.实体类配置

  1. @Data
  2. @TableName(value = "travel_cuisine", autoResultMap = true)public class TravelCuisineDO {
  3. private Long id;
  4. private String name;
  5. @TableField(typeHandler = JsonArrayTypeHandler.class)
  6. private JSONArray tagList;
  7. }
复制代码

3.自定义 TypeHandler(基于 FastJSON)

  1. public class JsonArrayTypeHandler extends BaseTypeHandler<JSONArray> {
  2. @Override
  3. public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
  4. ps.setString(i, parameter.toJSONString());
  5. }
  6. @Override
  7. public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
  8. String result = rs.getString(columnName);
  9. return JSON.parseArray(result);
  10. }
  11. @Override
  12. public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  13. String result = rs.getString(columnIndex);
  14. return JSON.parseArray(result);
  15. }
  16. @Override
  17. public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  18. String result = cs.getString(columnIndex);
  19. return JSON.parseArray(result);
  20. }
  21. }
复制代码

提醒:这个 JsonArrayTypeHandler 使用的是 FastJSON,如需 Jackson,请更换转换逻辑。

四、常见问题排查指南

问题现象解决方法或建议
typeHandler 没有生效检查实体类是否开启 autoResultMap = true
报 JSON parse error确保数据库字段是真正的 JSON 格式
存储时字段为 null确认字段不是 transient,且未被忽略
想用 List 代替 JSONArray写一个 ListStringTypeHandler 即可

总结:三件事必须配套使用

配置项说明
@TableField(typeHandler = …)标记字段转换器
@TableName(autoResultMap = true)告诉 MP 启用复杂映射
自定义 TypeHandler将 JSON 字段与 Java 类型进行互转

到此这篇关于MyBatis-Plus实现优雅处理JSON字段映射的文章就介绍到这了,更多相关MyBatis-Plus处理JSON字段映射内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表