PostgreSQL中提供了json数据类型,并支持常用的关系数据库的查询语法,在实际的工作中,存储复杂的数据带来一些便利,数据持久层的框架使用Mybatis进行处理的时候,需要单独处理Json类型的字段。在高版本的Mybatis Plus中已经对此支持了。以下纪录自定义类型处理函数来处理特定的字段类型。

自定义处理函数

继承Mybatis中的BaseTypeHandler,重写其中的几个方法,使用fastjson作为json字段的序列化和反序列化工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@MappedTypes({Object.class})
public class JsonTypeHandler extends BaseTypeHandler<Object> {

@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
PGobject pGobject = new PGobject();
pGobject.setType("jsonb");
pGobject.setValue(toJSONString(o));
preparedStatement.setObject(i,pGobject);
}

@Override
public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
return parseObject(resultSet.getString(s));
}

@Override
public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
return parseObject(resultSet.getString(i));
}

@Override
public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return parseObject(callableStatement.getString(i));
}
}

使用

在映射实体中使用

在实体中,需要转换的字段,加上处理函数@TableField(typeHandler = JsonTypeHandler.class),代码如下:

1
2
3
4
5
6
7
8
9
10
public class AppResourceInfoEntity implements Serializable {
private static final long serialVersionUID=1L;
@TableId(type = IdType.INPUT)
private String mdId;

private String code;

@TableField(typeHandler = JsonTypeHandler.class)
private Object resource;
}

在映射的xml文件中

还有一种方法是,在映射文件中指定类型处理类

1
2
3
4
<resultMap id="resMap" type="AppResourceInfoEntity">
<result property="code" column="code"/>
<result property="resource" column="resource" typeHandler="JsonTypeHandler"/>
</resultMap>

取出结果

在使用的过程中,需要将javaobject转换成json对象,取出的时候,同样需要将json字符串转化成java对象。

1
Book b=JSONObject.parseObject(appResourceInfo.getResource().toString(),Book.class);

PostgreSQL中json数据类型

建表语句:

1
2
3
4
5
6
7
8
CREATE TABLE "public"."app_resource_info" (
"md_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"code" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"resource" jsonb,
"update_time" date,
"update_by" varchar(255) COLLATE "pg_catalog"."default",
CONSTRAINT "app_resource_info_pkey" PRIMARY KEY ("md_id")
)

根据类型查询:

1
2
SELECT * FROM "app_resource_info" where
resource::json ->> 'resType'='book'