MySQL的JSON结构实现一对多的解决方案

目录

业务场景:

 MySQL的JSON结构

​编辑使用步骤:

1.在数据库设置Json字段

2.建立JAVA实体映射类(Json字段用String结构接收)

 3.通过序列化为JSON字符串的方式进行存储(JSON.toJSONString)

4. 通过JSON反序列化获取结果数据

业务场景:

        最近在做一个电子名片售卖的项目,一个用户可以在名片市场里面购买自己需要的名片。本来在设计表的时候,我第一时间想到的就是一种多对多的关系。因为每个人都能买不同的名片,并且不同的名片能被多个人购买。那我根据以往所学的知识,根据这种多对多的关系,就要建立一张第三方表,设置两个字段分别去关联用户表以及名片表,但仔细想想,这种方案带来的数据存储量是极为可怕的,一个用户如果买了100张名片,那么按这种方案的话,他就需要存储100条数据,那如果说一个用户买了1000张呢?如果说,有1000个这样的用户呢?那这样子的迭代下来数据就会格外的臃肿。最理想的状态就是一个用户就对应一条数据,并且该数据中含有该用户所购买的所有名片数据字段,也就是一个名片id的集合。经过一番查询,发现MySQL的JSON存储结构可以满足我的这种需求。


 MySQL的JSON结构

        自 MySQL5.7.8 版本以来,MySQL支持原生JSON数据类型。 允许使用原生JSON数据类型比以前MySQL版本中所使用varchar或text文本格式更能有效地存储JSON文档。 MySQL以内部格式存储JSON文档,允许对文档元素的快速读取访问。并且基于JSON结构的键值对存储,可以凭借键值设置更为高效的存储方案以及查询需求。

使用步骤:

1.在数据库设置Json字段

2.建立JAVA实体映射类(Json字段用String结构接收)

@TableName(value = "card_order_info",autoResultMap = true)
@Data
public class CardOrderInfo {


    /**
     * id
     */
    private Long id;

    /**
     * 用户id
     */
    private String userId;

    /**
     * 名片集合
     */
    @TableField(value="card_list",typeHandler = FastjsonTypeHandler.class)
    private String cardList;

}

 3.通过序列化为JSON字符串的方式进行存储(JSON.toJSONString)

 List<String> strings = new ArrayList<>();
 strings.add("aaa");
 strings.add("cscw");
 String jsonString = JSON.toJSONString(strings);
 CardOrderInfo cardOrderInfo1 = new CardOrderInfo();
 cardOrderInfo1.setCardList(jsonString);
 cardOrderInfo1.setUserId("22");
 cardOrderInfoMapper.insert(cardOrderInfo1);

4. 通过JSON反序列化获取结果数据

//通过userid获取
CardOrderInfo cardOrderInfo = cardOrderInfoMapper.selectOne(new QueryWrapper<CardOrderInfo>().eq("user_id", cardOrderInfo1.getUserId()));
if (cardOrderInfo==null){return null;}
String cardList = cardOrderInfo.getCardList();
JSONArray objects = JSON.parseArray(cardList);
List<String> cards = JSONObject.parseArray(objects.toJSONString(), String.class);

注意:当你从 MySQL 数据库中使用字符串类型(如 VARCHAR、TEXT)获取 JSON 字段时,MySQL 默认会将特殊字符进行转义,比如双引号 ", 斜杠 \ 等。这是为了保证 JSON 数据在字符串类型中的可靠存储,避免解析错误或意外终止字符串。然而,并不是所有的 MySQL 驱动或 ORM 框架都会自动执行反转义操作,这取决于具体的实现方式和配置。有些驱动或框架可能会直接返回包含转义字符的字符串,而有些则会将其进行反转义后再返回给你。为此,我们需要针对不同的情况对得到的Json字符串进行一个处理,才能保证我们能够将其正常反序列化。

解决步骤:

// 通过cardId查询数据
CardInfo cardInfo = cardInfoMapper.selectOne(new QueryWrapper<CardInfo>()
                .eq("card_id", cardId));// 此处的Json字符串为“"[\"aa\",\"bb\"]"”
// 除掉json结果的转义字符
String tagsList = cardInfo.getTagsList().replace("\\", "");// 为"["aa","bb"]"
String substring = tagsList.substring(1, tagsList.length() - 1);// 为["aa","bb"]
JSONArray objects = JSON.parseArray(substring); // 这样子才能正常转换

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学徒630

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值