今日和大家分享下关于数据库存储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实现的。
2.JSONArray底层使用ArrayList实现的。
下个问题就是关于统计的问题了,上个人做统计是把没次插入的结果进行统计插入另一张表中,而现在有个需求要在规定的时间内进行统计,那么导单独的时间表也无用了,可是现在遇见的问题是,插入的这张表统一个物品而子类属性确是不同的,在这里要对相同物品这个子类属性进行合并。
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';
可以修改其值
执行语句,可以设置作用范围:
SET GLOBAL group_concat_max_len=3000;
SET SESSION group_concat_max_len=3000;
在这里也和大家普及下,对数据库中json中指定的key进行模糊查询
select * from 表名 where json字段名->'$.key名' like '%XXX%'
其实字符串存储的格式和json格式相同也是可以通过上述代码进行模糊查询的。
到这里就和大家分享结束了,希望大家学习进步,多多关注哦!