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

2025-05-14 07:49:16 135
魁首哥

在使用 mybatis-plus 进行业务开发时,我们时常需要把数据库中的 json 字段(比如字符串形式的数组)自动映射成 java 中的 jsonarray 或 list 类型。

默认情况下,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 {

    @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 代替 jsonarray写一个 liststringtypehandler 即可

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

配置项说明
@tablefield(typehandler = …)标记字段转换器
@tablename(autoresultmap = true)告诉 mp 启用复杂映射
自定义 typehandler将 json 字段与 java 类型进行互转

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

分享
海报
135
上一篇:SpringBoot如何读取Resource下的文件 下一篇:通过Java计算文件的MD5值实现方式

忘记密码?

图形验证码