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'