使用 Mybatis \ Mybatis Plus 操作 MySQL JSON数据类型的疑问?

227 阅读2分钟

我的背景

今天在做聊天消息中的图片消息的时候,需要在发送图片消息后,进行一些扩展消息的补充,所以在Message 表中添加了 josn 类型的 extra字段:

create table tb_chat_message
(
    id              bigint               not null comment '聊天消息表id'
        primary key,
    sequence        bigint               null comment '消息序列号',
    message_feature int        default 0 null comment '消息属性:0.默认,1.离线消息,2.漫游消息,3.同步消息,4.透传消息,5.控制消息',
    message_type    int        default 1 null comment '消息类型:1.文本,2.图片,3.语音,4.图文混合,5.文件,6.语音通话,7.视频通话,
                                8.白板演示,9.远程控制,10.日程安排,11.外部分享,12.@消息,13.红包消息',
    content         text                 null comment '消息内容,最大文本数量1024个字符',
    url             varchar(1023)        null comment '图片,文件,视频,音频等等链接',
    extra           json                 null comment '扩展字段,一般使用JSON字符串存储,可以用户回复消息,@消息,超文本消息,卡片消息,视频消息等',
    deleted         tinyint(1) default 0 null comment '是否删除该条聊天记录,0.false, 1.ture',
    create_time     datetime             null comment '创建时间',
    update_time     datetime             null comment '更新时间'
)
    charset = utf8mb4;

可以看到其中的extra 字段是json 类型的,但是呢,这个补充扩展数据,是动态的,没有具体固定的Java 对象用来承接,它对应的实体对象会随着 消息类型 messagetType 的变化而进行对应的实体变化,所以不能像网上那样直接使用一个固定的实体来进行接收。

最开始自己是使用Map<String, Object> 来进行的接收,但是后续发现还需要把扩展对象转换为Map, 较为麻烦,而且不够高效,后来又把 extra 属性数据类型设置成为了Object:

/**
 * 扩展字段,一般使用JSON字符串存储,可以用户回复消息,@消息,超文本消息,卡片消息,视频消息等
 */
protected Object extra;

但是对于后续是否能够成功的写入和读取还是抱有怀疑,不知道这种动态类型的JSON 字段应该怎么样来设计,进行读写操作较为合理,还请各位网络大神给予指导。