JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍一种更通用的方式。
在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类型。
建测试表:
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();
}
}