MybatisPlus 如何存储JSONArray数据到数据库中

文章讲述了在使用MybatisPlus开发日志工具时,如何解决字段数据展示和存储时遇到的JSONArray类型转换问题,包括字段注解、typeHandler配置以及实体类autoResultMap的使用关键
摘要由CSDN通过智能技术生成

         在公司写日志工具的时候,出现了这样的问题,字段名,字段描述,修改前数据和修改后数据的展示,如果直接给前端传输的数据是几个字段分别提供这几个数据,那么在前端展示时,其实是不好展示的,遍历展示的话,组件展示出的效果是类似于列表展示的形式。

        如果字段多的话,就要滚轮左右拉动才能进行查看,其实不是很方便。这个时候只能将这几个字段放在同一个字段中,并且以字段名,字段描述,修改前数据和修改后数据为一个对象,这样保存,才方便前端展示,而这个时候又会出现问题。

        我们保存的时候希望以JSONArray的数据格式进行保存,而读取同样如此,但是如果不添加注解,直接保存是会出现错误的。

        我们需要在要保存的JSONArray类型的字段上添加注解

@TableField(value = "content", typeHandler = JacksonTypeHandler.class)

其中content是我们这个字段对应的数据库表的字段名,typeHandler 后面是我们需要的类型处理器,这个处理器我们也可以继承然后自定义,但是为了方便,我们还是用了MybatisPlus自带的处理器。

这仅仅是在字段上进行了注解,我们同时还要在mapper.xml进行处理器的标注,这样才能达到映射的效果。

<result column="content" property="content" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

这是在mapper.xml中字段映射的代码,我们其实是在后面加上了typeHandler和对应的映射器而已。

完成这两处修改,其实在数据插入的时候,就已经没有问题了,数据中的text类型的字段已经可以插入后端的JSONArray数据。

但是这个时候,你如果写个查询接口去查询数据,会发现,为什么查询不到保存的JSONArray数据呢,明明数据库中已经有了数据,但是查询出的数据却为空。

其实还是因为缺少了配置,我们要在JSONArray字段对应的实体类上添加注解。

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

其实这个注解大家一直都在用,但是我们都只用了前面的value部分,用来对应数据库表名。autoResultMap用来标注是否默认使用结果集,如果不添加这个属性,或者这个属性为false,那么我们在映射JSON字段类型的时候(包括JSONArray),其实查询结果是会直接返回null的,而添加了该字段为true,就能正常根据对应的类型处理器进行解析,从而查询到结果。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用压缩算法(如gzip或zlib)将JsonArray压缩为字节数组,然后将字节数组存储数据库字段。在读取数据时,可以将存储的字节数组解压缩为原始的JsonArray。 以下是一个示例代码,使用Java的Gzip压缩和解压缩方法: ```java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.json.JSONArray; public class JsonCompressionUtil { public static byte[] compressJsonArray(JSONArray jsonArray) throws IOException { String jsonStr = jsonArray.toString(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream); gzipOutputStream.write(jsonStr.getBytes(StandardCharsets.UTF_8)); gzipOutputStream.close(); return outputStream.toByteArray(); } public static JSONArray decompressJsonArray(byte[] compressedData) throws IOException { ByteArrayInputStream inputStream = new ByteArrayInputStream(compressedData); GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = gzipInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } String jsonStr = outputStream.toString(StandardCharsets.UTF_8); return new JSONArray(jsonStr); } } ``` 使用示例: ```java JSONArray jsonArray = new JSONArray(); jsonArray.put("apple"); jsonArray.put("banana"); jsonArray.put("orange"); byte[] compressedData = JsonCompressionUtil.compressJsonArray(jsonArray); // 将compressedData存储数据库字段 JSONArray decompressedJsonArray = JsonCompressionUtil.decompressJsonArray(compressedData); // decompressedJsonArray为原始的JsonArray ``` 请注意,压缩算法可以减少存储空间,但会增加CPU计算时间。在使用压缩算法时,请权衡存储空间和计算时间的成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值