存储

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转换相关推荐

  1. mysql讀取sql_MySQL数据库之python json及mysql读取json文件存sql等问题

    本文主要向大家介绍了MySQL数据库之python json及mysql读取json文件存sql等问题 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. preface: 近期帮师 ...

  2. json文件读取并转换成为字典python

    json文件读取并转换成为字典python # JSON到字典转化 f = open('info.json', 'r') info_data = json.load(f) print(info_dat ...

  3. 【python 3.6】python读取json数据存入MySQL(一)

    整体思路: 1,读取json文件 2,将数据格式化为dict,取出key,创建数据库表头 3,取出dict的value,组装成sql语句,循环执行 4,执行SQL语句 #python 3.6 # -* ...

  4. mysql json 数组_在MYSQL中读取JSON数组

    mysql> SET @`json` := -> '[ '> { '> "id": 1, "type": 2 '> }, '> ...

  5. mysql操作json优点和缺点_SQL-mysql操作json

    一 前言 MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型,其能在字段中使用json 类型,做到了自动校验是否为json类型数据,否则插入数据会报异常:其次,储存json ...

  6. [转] JSON转换

    转载自:http://www.360doc.com/content/12/0413/14/9529755_203286509.shtml# JSON简介 JSON(JavaScript Object ...

  7. js 中读取JSON的方

    js 中读取JSON的方法探讨 2009-03-01 16:08 js读取JSON的方法我接触到的有两种: 方法一:函数构造定义法返回 var strJSON = "{name:'json ...

  8. Python JS Jquery Json 转换关系

    一.JS对象与JSON格式数据相互转换 目前的项目数据交互几乎都用JQuery,所以处理流程是: 前端页面数据->JS对象->jQuery提交->python处理,另外一种就是倒过来 ...

  9. python读取json配置文件_Python简单读取json文件功能示例

    本文实例讲述了Python简单读取json文件功能.分享给大家供大家参考,具体如下: read_json.json: { "rule":{ "namespace" ...

最新文章

  1. php: 通过key获取多维数组中的值
  2. win10 jenkins svn android studio 自动化打包教程 以及一些问题的解决办法
  3. 2.3.3 进程互斥的硬件实现方法
  4. 对标 VS Code,JetBrains 的下一代 IDE :Fleet
  5. windows远程连接linux-安装xfce界面,ubuntn添加新用户
  6. 新款 Azure .NET SDK 如何设定 Content-Type
  7. 聊天ListView使用ViewHolder
  8. .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
  9. python手机解释器_python3
  10. android http 慢,android httpurlconnection數據連接速度慢
  11. hadoop获取文件系统接口
  12. 不用图像文件的圆角解决--跳起按钮制作(html)
  13. 希捷7200.12 固件问题重新上演
  14. dcp9030cdn定影_兄弟DCP-9030CDN驱动
  15. 腾讯云平台WordPress建站问题记录
  16. cdr圆形渐变填充怎么设置_CDR渐变填充实例教程
  17. 一张对数字图像处理贡献最大的花花公子人体照
  18. 数据库插入数据时报错(使用sqlyog创建数据库表插入中文数据时报错Incorrect string value: ‘\xE4\xBB\x8E\xE5\x85\xA5…’ for column ‘)
  19. 【2018国赛线上比赛】知识问答题真题演练第一波
  20. 基于Hadoop的项目实战-职位数据综合分析

热门文章

  1. Mapped Statements collection already contains value for com.ithaima.ssm.dao.IUserDao.save
  2. 傅里叶变换与拉普拉斯变换的概念理解
  3. 卷积神经网络的应用(人脸识别)
  4. ztree java 异步_使用 zTree 异步加载
  5. DMSP夜间灯光数据
  6. web测试bug清单
  7. 【labview教程02】labview的前世今生
  8. java 抛出指定异常信息_java 抛出异常处理的方法
  9. 使用hardhat 开发以太坊智能合约-验证合约
  10. Cocos2dx 菜单项控件-Menu