Mybatis实现存取Mysql的Json字段映射Java对象

  • 一、需求
  • 二、解决方案

一、需求

在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信息。使用json格式存储数据有它的优缺点,在这里我们就不细说了,有兴趣的朋友可以去查一下。

在进行开发的过程中,我们是希望在mysql中查询出的json格式数据直接映射成java对象;而java对象也可以转换成json格式数据进行存储;在这里记录一下我们如何实现这样的需求。

二、解决方案

定义一个JsonTypeHandler类,继承于org.apache.ibatis.type.BaseTypeHandler,代码如下:

public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {private static final ObjectMapper mapper = new ObjectMapper();private Class<T> clazz;public JsonTypeHandler(Class<T> clazz) {if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, this.toJson(parameter));}@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {return this.toObject(rs.getString(columnName), clazz);}@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return this.toObject(rs.getString(columnIndex), clazz);}@Overridepublic T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return this.toObject(cs.getString(columnIndex), clazz);}private String toJson(T object) {try {return mapper.writeValueAsString(object);} catch (Exception e) {throw new RuntimeException(e);}}private T toObject(String content, Class<?> clazz) {if (content != null && !content.isEmpty()) {try {return (T) mapper.readValue(content, clazz);} catch (Exception e) {throw new RuntimeException(e);}} else {return null;}}static {mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);}
}

用法:

入库:#{jsonDataField, typeHandler=com.tiptimes.oa.system.util.JsonTypeHandler}
出库:
<resultMap>
<result property="jsonDataField" column="json_data_field" javaType="com.xxx.MyClass" typeHandler="com.XXX.JsonTypeHandler"/>
</resultMap>

通过以上的配置就可以实现我们想要的功能,亲测有效

Mybatis实现存取Mysql的Json字段映射Java对象相关推荐

  1. MySQL查询 json 字段中是否包含某个value

    MySQL查询 json 字段中是否包含某个value 方法一: 1.简单版本 :查询json的key SELECT * FROM 表名 where 字段名 -> '$.json中的key' = ...

  2. java jsonalias_将多个JSON字段映射到单个Java字段

    简介 本文中,教大家如何使用Jackson和Gson将不同的JSON字段映射到单个Java字段中. Maven依赖 为了使用Jackson和Gson库,我们需要在POM中添加以下依赖项: com.go ...

  3. 对象json字符串数组 java对象,java把json的字符串转换为json对象和数组

    [Json--使用Json jar包实现Json字符串与Java对象或集合之间的互相转换] 1,[java将JSON字符串转换为实体类对象 @SuppressWarnings(unchecked)pu ...

  4. json 解析 转java对象数组对象数组对象_json字符串转java对象数组

    需要引入json-lib-2.2-jdk15.jar和ezmorph-1.0.6.jar包 String itemStar = request.getParameter("itemStar& ...

  5. java中将json字符串_Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  6. JSON数据和Java对象的相互转换

    * JSON解析器:         * 常见的解析器:Jsonlib,Gson,fastjson,jackson          1. JSON转为Java对象         1. 导入jack ...

  7. Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...

  8. Json对象与Json字符串的转化、JSON字符串与Java对象的转换

    一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...

  9. json字符串与java对象的相互转换(jackson)

    1.java对象转换为json字符串 package com.chichung.json;import com.fasterxml.jackson.core.JsonProcessingExcepti ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task05. 最接近的三数之和
  2. 一文详解随机一致性采样算法:RANSAC
  3. 未安装在此服务器场中,无法添加到该范围
  4. c++17(9)-多参数列表
  5. SAP Commerce Cloud(原Hybris) impex 里的美元(dollar $)符号
  6. [Nginx]nginx 配置实例-负载均衡
  7. 如何查看使用 Cloud Toolkit 部署应用的实时日志
  8. 计算机主机名称命令,怎么用dos指令修改计算机名
  9. [译]Vulkan教程(20)重建交换链
  10. xadmin与mysql数据库_django和xadmin打造后台管理系统(一)-xadmin安装及使用
  11. Java Web系列:Hibernate 基础
  12. C++标准转换运算符:reinterpret_cast
  13. ffmpeg加马赛克
  14. 【Unity3D-UGUI原理篇】(二)Canvas Scaler 缩放原理
  15. 把期货当现货做,专业投机大局观
  16. vue3 路由缓存页面
  17. 仅有银行转账凭证,是否可认定为民间借贷关系
  18. 013 基于truffle的PetShop案例
  19. 研究2:如何快速区分出游戏美术风格
  20. 傅里叶变化(一)—— 复数

热门文章

  1. 【代码】Go语言程序设计
  2. 转载:Joel Spolsky: 创业公司如何公平分配股权?
  3. Sql之left join(左关联)、right join(右关联)、inner join(自关联),以及笛卡儿积表的区别
  4. 微信公众号怎么设置下载文件
  5. 【水文模型】SWAT水文模型原理及数据库简介
  6. [免费专栏] Android安全之Android加密算法浅析
  7. 【复变函数与积分变换】06. 拉普拉斯变换
  8. db+Nacos的方式部署高可用集群模式
  9. IT项目管理实践经验分享
  10. 【层级文本分类】Constrained Sequence-to-Tree Generation for Hierarchical Text Classification