今日和大家分享下关于数据库存储json类型存在的问题,以及数据库多条数据合并一条数据的sql使用问题等。
最近在公司接收了一个新系统,需要在原来的基础上添加一些字段,以及相关统计信息做出一定的修改。需求评审会议开的倒不少,最后要面对后端代码的也是自己孤身一人。看别人的代码给我的第一感觉就是乱,不过在中能学到上个人处理问题的逻辑,可以学习学习,也能提升一下自己。
要处理的第一个问题就是对数据库json字段的子类按照指定规则进行排序,然后我就在插入的时候先排序再插入,然后展示的时候使用

Map<String,String> json1 = 
JSONObject.parseObject(json.toJSONString(),new TypeReference<Map<String,String>>(){},Feature.OrderedField);

一切都准备好,就差验证,意外总在我意料范围之外数据库可偏偏不是按照排序后的顺序存储json字符串的,而是按照json的key正序排序,后来查找了很多方法也是不能修改json的key的顺序,让自己陷入了深洞中,后来为了不破坏原来的数据以及格式,把json类型转化成text类型了,而实体类json也换成了String类型,这也花费了自己很长一段时间,把所有相关字段json->String类型。此问题到这里也算是解决了。不过此处也是有坑的,在String转化为JSONObject类型时,要加上Feature.OrderedField按照String顺序转化成JSONObject,否者顺序也会变化。

在这里普及一下:

1.JSONObject底层使用HashMap/LinkedHashMap实现的。

sqlalchemy json数据 存储 sql处理json数组_开发语言

2.JSONArray底层使用ArrayList实现的。

sqlalchemy json数据 存储 sql处理json数组_java_02


下个问题就是关于统计的问题了,上个人做统计是把没次插入的结果进行统计插入另一张表中,而现在有个需求要在规定的时间内进行统计,那么导单独的时间表也无用了,可是现在遇见的问题是,插入的这张表统一个物品而子类属性确是不同的,在这里要对相同物品这个子类属性进行合并。

SELECT GROUP_CONCAT(列名 SEPARATOR ',') as XXX FROM 表名 group by 列名

扩展:两列合成一列

select concat('列名1', "_", '列名2') as 别名 from 表名

代码在这里就和大家简化一下了,公司中业务代码要比着复杂很多,希望大家知道如何处理类似的问题。
不过GROUP_CONCAT(列名 SEPARATOR ‘,’)长度为1024

show variables like 'group_concat_max_len';

sqlalchemy json数据 存储 sql处理json数组_sql_03


可以修改其值

执行语句,可以设置作用范围:
  SET GLOBAL group_concat_max_len=3000;
  SET SESSION group_concat_max_len=3000;

sqlalchemy json数据 存储 sql处理json数组_java_04

在这里也和大家普及下,对数据库中json中指定的key进行模糊查询

select * from 表名 where json字段名->'$.key名' like '%XXX%'

其实字符串存储的格式和json格式相同也是可以通过上述代码进行模糊查询的。
到这里就和大家分享结束了,希望大家学习进步,多多关注哦!