<返回更多

JDBC读写Postgresql jsonb类型数据最佳兼容方案

2021-12-23    dingle
加入收藏

前言

JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍一种更通用的方式。

JDBC URL中添加参数

在Postgresql的jdbc url中可以添加一个参数,如下:

jdbc:postgresql://xxx.xxx.xxx:5432/postgres?stringtype=unspecified

官方对stringtype参数的解释是:

stringtype : String

Specify the type to use when binding PreparedStatement parameters set via setString(). If stringtype is set to VARCHAR (the default), such parameters will be sent to the server as varchar parameters. If stringtype is set to unspecified, parameters will be sent to the server as untyped values, and the server will attempt to infer an Appropriate type. This is useful if you have an existing application that uses setString() to set parameters that are actually some other type, such as integers, and you are unable to change the application to use an appropriate method such as setInt().

因此当stringtype=unspecified 时,statement.setString()方法的参数将以未知的类型发送给pg数据库,由数据库根据表中字段的类型进行推定和自动转换。也就是说我们可以以字符串形式给postgresql数据库中各种类型的数据进行赋值,当然也可以支持jsonb类型。

JDBC代码示例

建测试表:

create table t_test( name varchar(20) primary key, props jsonb);

插入数据:

Class.forName("org.postgresql.Driver");

Connection con = null;

try {

String url="jdbc:postgresql://xxxx.xxxx.xxxx:5432/postgres?stringtype=unspecified";

con = DriverManager.getConnection(url, "username", "password");

con.setAutoCommit(false);

 

String sql= "insert into t_test(name, props) values(?,?)";

PreparedStatement statement = con.prepareStatement();

statement.setString(1, "zhangsan");

statement.setString(2, "{"age":23, "email":"zhangsan@xxx.com"}");

statement.executeUpdate();

con.commit();

} catch (Exception ex) {

ex.printStackTrace();

con.rollback();

} finally {

if (con != null) {

con.close();

}

}

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>