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

 更新时间:2025年04月22日 09:06:47   作者:William Dawson  
默认情况下,MyBatis-Plus 是不支持直接映射 JSON 类型的,这时候就需要借助其他的方法,下面小编就来和大家讲讲MyBatis-Plus如何优雅处理JSON字段映射吧

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

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

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

真实场景举例

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

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

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

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

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

一、@TableField + typeHandler 是什么?

@TableField 简介

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

核心参数如下:

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

typeHandler 作用

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

你可以用它来处理:

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

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

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

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

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

autoResultMap 是什么?

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

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

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

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

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,请更换转换逻辑。

四、常见问题排查指南

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

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

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

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

相关文章

  • 解决mybatisplus插入报错argument type mismatch的问题

    解决mybatisplus插入报错argument type mismatch的问题

    这篇文章主要介绍了解决mybatisplus插入报错argument type mismatch的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • java int类型二维数组实现“杨辉三角”的完整实例

    java int类型二维数组实现“杨辉三角”的完整实例

    这篇文章主要给大家介绍了关于java int类型二维数组实现“杨辉三角”的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring Security实现用户名密码登录详解

    Spring Security实现用户名密码登录详解

    这篇文章主要为大家详细介绍了Spring Security如何实现用户名密码登录功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-10-10
  • IDEA 设置显示内存的使用情况和内存回收的方法

    IDEA 设置显示内存的使用情况和内存回收的方法

    这篇文章主要介绍了IDEA 设置显示内存的使用情况和内存回收的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 教你如何使用google.zxing结合springboot生成二维码功能

    教你如何使用google.zxing结合springboot生成二维码功能

    这篇文章主要介绍了使用google.zxing结合springboot生成二维码功能,我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Java异常处理操作实例小结

    Java异常处理操作实例小结

    这篇文章主要介绍了Java异常处理操作,结合实例形式总结分析了java异常处理常见操作情况与相关处理技巧,需要的朋友可以参考下
    2019-07-07
  • 基于SpringBoot和Vue的动态语音播放实现

    基于SpringBoot和Vue的动态语音播放实现

    本文介绍如何使用SpringBoot和Vue实现音频文件的动态播放,包括前端页面设计、后端接口开发、音频文件存储和调用等方面。通过该实现,用户可以在网页上直接播放音频,增强用户体验,提高网站互动性
    2023-04-04
  • java Socket编程实现I/O多路复用的示例

    java Socket编程实现I/O多路复用的示例

    本文主要介绍了java Socket编程实现I/O多路复用的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Spring中基于xml的AOP实现详解

    Spring中基于xml的AOP实现详解

    这篇文章主要介绍了Spring中基于xml的AOP实现详解,基于xml与基于注解的AOP本质上是非常相似的,都是需要封装横切关注点,封装到切面中,然后把横切关注点封装为一个方法,再把该方法设置为当前的一个通知,再通过切入点表达式定位到横切点就可以了,需要的朋友可以参考下
    2023-09-09
  • Swagger2配置方式(解决404报错)

    Swagger2配置方式(解决404报错)

    这篇文章主要介绍了Swagger2配置方式(解决404报错),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论