mysql中处理某个字段的json,将json中冗余内容去掉

mysql中某个字段存在json,且json数据过大,严重影响查询效率。

处理办法:将此字段提出来,新建一个字段,将此json中的字段除大文件(类似于图片和音视频的base64格式)都转移,base64字段数据置为空。

 将执行结果转移到新的字段,去掉base64字段的冗余。

原数据格式:

 

 

(新建字段)

ALTER table `patrol_item_result_copy1` ADD result  MEDIUMTEXT COMMENT '执行结果-新';
-- 将patrol_item_result_copy1表的execute_result字段复制到表中的result字段

(先测试100条数据)
update patrol_item_result_copy1 a set a.result = a.execute_result limit 100;

(因为存在base64,json的格式也不规范,先规范下)
UPDATE patrol_item_result_copy1 SET result = REPLACE (result,'\\','');
UPDATE patrol_item_result_copy1 SET result = REPLACE (result,'/','');
UPDATE patrol_item_result_copy1 SET result = REPLACE (result,'"{','{');
UPDATE patrol_item_result_copy1 SET result = REPLACE (result,'}"','}');

这一步处理之后的数据:

 

(查看json中的转义后的数据,是否正确)
SELECT json_extract(result,'$.result.mes.base64Code') from patrol_item_result_copy1 limit 100;

 

-- UPDATE patrol_item_result_copy1 SET result = json_remove(result, '$.result.mes.base64Code'); -- 删除base64


UPDATE patrol_item_result_copy1 SET result = json_set(result, '$.result.mes.base64Code',''); -- 将base64内容置为空
 

最后的处理结果:

 

### Java 中 MySQL JSON 数据的映射与处理 在 Java 和 MySQL 的交互过程中,JSON 类型的数据可以通过多种方式实现映射和处理。以下是详细的说明: #### 1. 使用 `JDBC` 处理 MySQL JSON 字段 当通过 JDBC 查询 MySQL 表中的 JSON 列时,查询返回的结果可能是一个字符串形式的 JSON 而非真正的 JSON 对象[^2]。因此,在接收数据时需要注意其实际类型。 如果需要将该字段作为 JSON 对象来操作,则可以借助第三方库(如 Jackson 或 Gson)将其解析为 Map 或其他结构化的对象。例如: ```java // 假设我们有一个名为 json_column 的列存储了 JSON 数据 ResultSet rs = statement.executeQuery("SELECT id, json_column FROM my_table"); while (rs.next()) { String jsonString = rs.getString("json_column"); // 获取 JSON 字符串 // 将 JSON 字符串转换为 Map ObjectMapper objectMapper = new ObjectMapper(); try { Map<String, Object> map = objectMapper.readValue(jsonString, Map.class); System.out.println(map); // 输出解析后的 JSON 数据 } catch (JsonProcessingException e) { e.printStackTrace(); // 如果解析失败则打印错误日志 } } ``` 上述代码展示了如何利用 Jackson 库读取并解析来自数据库的 JSON 字符串。 #### 2. 自定义 TypeHandler 来支持 MyBatis 框架下的 JSON 映射 对于基于 MyBatis 的项目来说,为了更方便地完成从数据库到实体类之间的转化工作,通常会编写自定义 type handler。下面给出一个简单的例子: ```java @MappedTypes({Map.class}) @MappedJdbcTypes(JdbcType.VARCHAR) public class JsonMapTypeHandler extends BaseTypeHandler<Map<String, Object>> { private final ObjectMapper mapper; public JsonMapTypeHandler(ObjectMapper mapper){ this.mapper = mapper; } @Override public void setNonNullParameter(PreparedStatement ps, int i, Map<String, Object> parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, toJson(parameter)); // 把 Map 转换成 JSON 字符串存入 DB } @Override public Map<String, Object> getNullableResult(ResultSet rs, String columnName) throws SQLException { return toMap(rs.getString(columnName)); // 取出 JSON 字符串转回 Map } protected String toJson(Map<String, Object> obj){ try{ return mapper.writeValueAsString(obj); }catch(JsonProcessingException ex){ throw new RuntimeException(ex.getMessage(),ex); } } protected Map<String,Object> toMap(String s){ try{ return mapper.readValue(s,new TypeReference<Map<String,Object>>() {}); }catch(IOException ex){ throw new RuntimeException(ex.getMessage(),ex); } } } ``` 此部分实现了对复杂数据类型的序列化与反序列化功能[^1]。 #### 3. 注解驱动的方式简化开发流程 除了手动配置外还可以采用注解的形式进一步减少冗余代码量。比如前面提到过的 `Entity` 注解就可以用来标记哪些 POJO 需要被持久化至关系型数据库当中[^3]。另外还有 Hibernate 提供的相关特性也可以考虑引入进来辅助完成整个 ORM 层面的设计需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值