MySQL读取JSON转换
存储
mysql5.7+开始支持存储JSON,后续不断优化,应用也越来越广泛
你可以自己将数据转换成Json String后插入,也可以选择使用工具,
而mybatis-plus就为此提供了非常简便的方式,
只需要在字段上加上 @TableField(typeHandler = XxxTypeHandler.class),
mybatis-plus就会自动帮你做转换,通用一般就两个:- com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler- com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler
例如
@Data
@TableName(autoResultMap = true)
public class Department implements Serializable {private static final long serialVersionUID = 203788572415896870L;@TableField(typeHandler = FastjsonTypeHandler.class)private List<Integer> userIds;
}
存在什么问题?
如果使用通用处理器,那对于基础类型以及对象来说没有什么问题。
但如果存储的字段类型是对象集合,那么当你取出来时,会发现集合中的对象都是JSONObject类型。
最常见的情况就拿出来进行遍历操作时,会抛出强转异常:java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to ...
因为处理器帮你转换时,并不会存储你集合的泛型,所以统统都按照Object类型来转换了:@Overrideprotected Object parse(String json) {return JSON.parseObject(json, type);}
例如下面这种形式的类:
@Data
@TableName(autoResultMap = true)
public class Department implements Serializable {private static final long serialVersionUID = 203788572415896870L;@TableId(value = "id", type = IdType.AUTO)private Integer id;@TableField(typeHandler = FastjsonTypeHandler.class)private List<User> users;@Datapublic static class USer implements Serializable {// ...}
}
如何处理
- 方式一:自定义处理器,自己做类型转换,这也是当前最普遍的方式,但是对于存在List字段的对象,还需要在XxxMapper.xml中进行resultMap配置
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ListFastJsonTypeHandler extends FastjsonTypeHandler {private final Class<? extends Object> type;public ListFastJsonTypeHandler(Class<?> type) {super(type);this.type = type;}/*** 自己将json转换成list* @param json* @return*/@Overrideprotected Object parse(String json) {return JSON.parseArray(json, this.type);}
}
<mapper namespace="com.xxx.cn.mapper.DepartmentMapper"><resultMap id="BaseResultMap" type="com.xxx.cn.domain.Department"><id property="id" column="id"/><result property="users" column="users" jdbcType="VARCHAR"javaType="com.xxx.cn.domain.Department.User"typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/></resultMap>
</mapper>
配置完成后,ListFastJsonTypeHandler就会将json转换成javaType对应的对象集合了
- 方式二:配置一个Mybatis插件,拦截ResultSetHandler,将返回结果进行处理。 这样的好处就是不用写自定义的处理器和在XxxMapper.xml中做配置,减少了工作
@Component
@Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
public class ResultSetInterceptor implements Interceptor {/*** json序列化规则*/private final SerializerFeature[] serializerFeatures = {SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullStringAsEmpty};@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object proceed = invocation.proceed();if (containJSONObject(proceed)) {if (proceed instanceof Collection) {return JSON.parseArray(JSON.toJSONString(proceed, serializerFeatures), ((Collection<?>) proceed).toArray()[0].getClass());}return JSON.parseObject(JSON.toJSONString(proceed, serializerFeatures), proceed.getClass());}// if (proceed instanceof Collection) {// for (Object obj : ((Collection<?>) proceed)) {// parseJSON2Object(obj, obj.getClass());
// }
// } else {// parseJSON2Object(proceed, proceed.getClass());
// }return proceed;}/*** 将返回数据中心的JSONObject对象转换成正常的对象** @param obj* @param typeClass* @throws IllegalAccessException* @throws ClassNotFoundException*/private void parseJSON2Object(Object obj, Class<?> typeClass) throws IllegalAccessException, ClassNotFoundException {for (Field declaredField : typeClass.getDeclaredFields()) {declaredField.setAccessible(true);Object value = declaredField.get(obj);if (isNullValueField(value)) {continue;}Type genericType = declaredField.getGenericType();String fieldClassName = genericType.getTypeName();if (genericType instanceof ParameterizedType) {fieldClassName = ((ParameterizedType) genericType).getActualTypeArguments()[0].getTypeName();}if (containJSONObject(value)) {if (value instanceof Collection) {declaredField.set(obj, JSON.parseArray(JSON.toJSONString(value, serializerFeatures), Class.forName(fieldClassName)));} else {declaredField.set(obj, JSON.parseObject(JSON.toJSONString(value, serializerFeatures), Class.forName(fieldClassName)));}}}}/*** 判断是否跳过字段** @param value* @return*/private Boolean isNullValueField(Object value) {return null == value || "".equals(String.valueOf(value).trim())|| (value instanceof Collection && ((Collection<?>) value).size() == 0);}/*** 判断值是否包含JSONObject对象** @param value* @return* @throws IllegalAccessException*/private boolean containJSONObject(Object value) throws IllegalAccessException {if (isNullValueField(value)) {return false;}if (value instanceof Collection) {for (Object obj : (Collection<?>) value) {if (obj instanceof JSONObject) {return true;}if (obj instanceof Collection && containJSONObject(obj)) {return true;} else {for (Field declaredField : obj.getClass().getDeclaredFields()) {declaredField.setAccessible(true);Object fieldValue = declaredField.get(obj);if (isNullValueField(fieldValue)) {continue;}if (fieldValue instanceof JSONObject) {return true;}if (fieldValue instanceof Collection && containJSONObject(fieldValue)) {return true;}}}}return false;}return value instanceof JSONObject;}
}
MySQL读取JSON转换相关推荐
- mysql讀取sql_MySQL数据库之python json及mysql读取json文件存sql等问题
本文主要向大家介绍了MySQL数据库之python json及mysql读取json文件存sql等问题 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. preface: 近期帮师 ...
- json文件读取并转换成为字典python
json文件读取并转换成为字典python # JSON到字典转化 f = open('info.json', 'r') info_data = json.load(f) print(info_dat ...
- 【python 3.6】python读取json数据存入MySQL(一)
整体思路: 1,读取json文件 2,将数据格式化为dict,取出key,创建数据库表头 3,取出dict的value,组装成sql语句,循环执行 4,执行SQL语句 #python 3.6 # -* ...
- mysql json 数组_在MYSQL中读取JSON数组
mysql> SET @`json` := -> '[ '> { '> "id": 1, "type": 2 '> }, '> ...
- mysql操作json优点和缺点_SQL-mysql操作json
一 前言 MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型,其能在字段中使用json 类型,做到了自动校验是否为json类型数据,否则插入数据会报异常:其次,储存json ...
- [转] JSON转换
转载自:http://www.360doc.com/content/12/0413/14/9529755_203286509.shtml# JSON简介 JSON(JavaScript Object ...
- js 中读取JSON的方
js 中读取JSON的方法探讨 2009-03-01 16:08 js读取JSON的方法我接触到的有两种: 方法一:函数构造定义法返回 var strJSON = "{name:'json ...
- Python JS Jquery Json 转换关系
一.JS对象与JSON格式数据相互转换 目前的项目数据交互几乎都用JQuery,所以处理流程是: 前端页面数据->JS对象->jQuery提交->python处理,另外一种就是倒过来 ...
- python读取json配置文件_Python简单读取json文件功能示例
本文实例讲述了Python简单读取json文件功能.分享给大家供大家参考,具体如下: read_json.json: { "rule":{ "namespace" ...
最新文章
- php: 通过key获取多维数组中的值
- win10 jenkins svn android studio 自动化打包教程 以及一些问题的解决办法
- 2.3.3 进程互斥的硬件实现方法
- 对标 VS Code,JetBrains 的下一代 IDE :Fleet
- windows远程连接linux-安装xfce界面,ubuntn添加新用户
- 新款 Azure .NET SDK 如何设定 Content-Type
- 聊天ListView使用ViewHolder
- .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
- python手机解释器_python3
- android http 慢,android httpurlconnection數據連接速度慢
- hadoop获取文件系统接口
- 不用图像文件的圆角解决--跳起按钮制作(html)
- 希捷7200.12 固件问题重新上演
- dcp9030cdn定影_兄弟DCP-9030CDN驱动
- 腾讯云平台WordPress建站问题记录
- cdr圆形渐变填充怎么设置_CDR渐变填充实例教程
- 一张对数字图像处理贡献最大的花花公子人体照
- 数据库插入数据时报错(使用sqlyog创建数据库表插入中文数据时报错Incorrect string value: ‘\xE4\xBB\x8E\xE5\x85\xA5…’ for column ‘)
- 【2018国赛线上比赛】知识问答题真题演练第一波
- 基于Hadoop的项目实战-职位数据综合分析
热门文章
- Mapped Statements collection already contains value for com.ithaima.ssm.dao.IUserDao.save
- 傅里叶变换与拉普拉斯变换的概念理解
- 卷积神经网络的应用(人脸识别)
- ztree java 异步_使用 zTree 异步加载
- DMSP夜间灯光数据
- web测试bug清单
- 【labview教程02】labview的前世今生
- java 抛出指定异常信息_java 抛出异常处理的方法
- 使用hardhat 开发以太坊智能合约-验证合约
- Cocos2dx 菜单项控件-Menu