前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理 。本文介绍一种更通用的方式 。
JDBC URL中添加参数在Postgresql的jdbc url中可以添加一个参数,如下:
jdbc:postgresql://xxx.xxx.xxx:5432/postgres?stringtype=unspecified
官方对stringtype参数的解释是:
stringtype : String因此当stringtype=unspecified 时,statement.setString()方法的参数将以未知的类型发送给pg数据库,由数据库根据表中字段的类型进行推定和自动转换 。也就是说我们可以以字符串形式给postgresql数据库中各种类型的数据进行赋值,当然也可以支持jsonb类型 。
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().
JDBC代码示例
建测试表:
create table t_test( name varchar(20) primary key, props jsonb);
插入数据:
【JDBC读写Postgresql 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();
}
}
推荐阅读
- c#读写SQLite数据库文件例子
- SpringBoot通过JdbcTemplate操作MySQL数据库
- 读写文件 Python csv模块
- MySQL MyCAT 读写分离实战
- 搭建MySQL主从实现Django读写分离
- MySQL 读写分离
- mysql数据库的主从同步,实现读写分离
- Java,ShardingSphere,Sharding-JDBC,分库分表的入门程序案例
- CPU分整数浮点运算、SSD分顺序随机读写,决定性能的到底是哪个?
- PostgreSQL的最佳群集高可用性方案