最近新开发的一个功能使用到postgresql中的jsonb数据类型。架构师可能考虑到这种数据格式更加便于存储json格式的数据,因此考虑使用这种数据类型。自己以前未曾使用过这种数据类型,因此需要现学现用。同事给我指点了一下,说这种数据类型可以当做字符串来处理。马上去搜索引擎中查找学习资料,看看这种数据类型的应用场景,以及如何使用这种数据类型。看了很多篇博文,认识到这种数据类型不能直接使用mybatis插入,需要单独使用转换类。自己试着按照网友提供的教程测试,发现可以正常新增数据。注意事项:需要使用JSON.toJSONString()方法将需要处理的数据进行转换,并且这种转换是在转换类中完成的。

转换类的示例代码如下:

@MappedTypes({Object.class})

public class JsonbTypeHandler extends BaseTypeHandler<Object> {

private static final PGobject pGobject = new PGobject();

@Override

public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {

pGobject .setType("jsonb");

pGobject .setValue(JSON.toJSONString(o));

preparedStatement.setObject(i,  pGobject);

}

@Override

public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {

return resultSet.getString(s);

}

@Override

public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {

return resultSet.getString(i);

}

@Override

public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {

return callableStatement.getString(i);

}

}

mybatis的xml文件中的用法为ac_title = #{addition, typeHandler=包路径.JsonbTypeHandler},

  开发的功能中页面传入的数据是数组类型,后端Java接收的时候使用的是Object类型。使用mybatis逆向工程插件生成的实体类中,jsonb类型对应的java数据类型也是Object类型。新增数据的时候,通过上面的转换类将Object类型转换为jsonb类型,这样即可新增成功。修改操作和新增操作一样,不再赘述。新增操作完成后下一步就是查询,取数据的时候mybatis中直接使用varchar类型接收,代码中还是使用Object接收即可。

  根据业务需求,开发过程中还需要解析jsonb格式的数据。由于数据格式不一样,解析的方式也不一样,自己使用的JSON框架是fastJson框架。第一种情况,从页面中传入的json数组数据,解析的时候直接使用JSON.parseArray();由于是使用Object数据类型接收,需要使用JSON.toJSONString()方法转换一下,才可以转换为list集合。示例代码如下

List<String> dataList = JSON.parseArray(JSON.toJSONString(Object类型的数据), String.class);

这样就可以获取到页面中传入的JSON数组数据,然后在做进一步的处理即可。第二种情况,如果是已经保存到数据库中的数据,则直接使用JSON.parseArray()进行转换即可,不需要其他操作。示例代码如下:

List<String> dataList = JSON.parseArray(数据库中的数据.toString(), String.class);

测试过程中,解析json数据遇到的一些问题,主要就是转换错误的问题。经过反反复复的尝试,最终才确定下来如何进行转换,如何进行解析。已经部署在测试环境中正常运行,各种功能都正常,即将发布新版本,到此功能完成。

参考博文:

https://www.cnblogs.com/liangyy/p/13573043.html

mybatis使用postgresql中的jsonb数据类型的更多相关文章

  1. PostgreSQL 中定义自己需要的数据类型

    PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...

  2. PostgreSQL中JSON、JSONB基本操作符

    PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作 JSON 变得非常方便了. 一. -> 和 ->> : -> 表示获取一个JSON数组元素,支持下标值( ...

  3. Postgresql中的数据类型大全

    一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...

  4. Mybatis使用- Mybatis JdbcType与Oracle、MySql数据类型对应列表 ; Mybatis中javaType和jdbcType对应关系

    Mybatis JdbcType与Oracle.MySql数据类型对应列表  Mybatis JdbcType Oracle MySql JdbcType ARRAY     JdbcType BIG ...

  5. golang自己定义数据类型查询与插入postgresql中point数据

    golang自己定义数据类型查询与插入postgresql中point数据 详细代码例如以下: package main import ( "bytes" "databa ...

  6. 【转】Mybatis 3.1中 Mapper XML 文件 的学习详解

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

  7. PostgreSQL 中日期类型转换与变量使用及相关问题

    PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date; date ------------ 2015-08-31 (1 row ...

  8. PostgreSQL学习手册(常用数据类型)

    一.数值类型:     下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer ...

  9. PostgreSQL自学笔记:5 数据类型和运算符

    5 数据类型和运算符 5.1 PostgreSQL 数据类型介绍 5.1.1 整数类型 整型类型 字节 取值范围 smallint 2字节 -2^15 ~ 2^15 int integer 4字节 - ...

  10. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

随机推荐

  1. 语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse

    基于无监督预训练语义索引召回:SimCSE.Diffcse 语义索引(可通俗理解为向量索引)技术是搜索引擎.推荐系统.广告系统在召回阶段的核心技术之一.语义索引模型的目标是:给定输入文本,模型可以从海 ...

  2. .NET Core开发实战(第1课:课程介绍)--学习笔记

    01 | 课程介绍 讲师介绍 肖伟宇,校宝在线架构师.SkyWalking .NET探针贡献者.NetCorePal组件库创建者 为什么要学习 .NET Core 微软大力支持推动 .Net 技术生态 ...

  3. SP34020 ADAPET - Ada and Pet 题解

    题目传送门 前置知识 前缀函数与 KMP 算法 解法 经检验 样例,我们发现 \(|S|k\) 并不是最优答案. 考虑利用 luogu P4391 [BOI2009] Radio Transmissi ...

  4. 五一不休息,每天都学习,从零教你手写节流throttle

    壹 ❀ 引 我在 从零教你手写实现一个防抖debounce方法 一文中详细的介绍了防抖概念,以及如何手写一个防抖.既然聊到防抖那自然避不开同等重要的节流throttle,老规矩,我们先阐述节流的概念, ...

  5. NEMU PA 3-3 实验报告

    一.实验目的 在上一章PA3-2中,我们实现了分段机制,将48位的虚拟地址vaddr转换成了laddr.为什么不是paddr呢?这就要说到这一章要完成的东西:**分页机制 **. 从80386开始,计 ...

  6. CF383C Propagating tree

    题目链接 题目 见链接. 题解 知识点:DFS序,树状数组. 我们需要对子树的不同奇偶层加减,用dfn序可以解决子树问题,但是并不能直接分奇偶. 一种比较麻烦的思路是,将dfn序分成两个序列,一个是偶 ...

  7. JSP使用FileUpload上传文件设置setSizeMax后连接被重置

    今天在学习利用JSP+Servlet+FileUpload开发文件上传功能.在设置了上传文件最大限制为10M以后,选择了3M的pdf上传提交后连接被重置了... 我的代码: //设置上传单个文件的大小 ...

  8. 分享一个Github相关彩蛋

    楼上很多回答 都是基于手把手实操Github.Git源代码管理相关, 这些操作"无他,唯手熟尔". 今天提供一个github上阅读源码的小技巧,逆天级别的彩蛋. 要想成为大神,Gi ...

  9. win32-FileTimeToSystemTime的使用

    #include <Windows.h> #include <iostream> #include <string> #pragma warning(disable ...

  10. Docker实践之08-使用网络

    目录 一.外部访问容器 启动容器时指定参数-P(大写P) 启动容器时指定参数-p(小写p) 二.容器互联 使用--link参数使容器互联 将容器加入自定义网络实现互联 三.为容器配置DNS 一.外部访 ...