• pgsql操作json类型


    目录

    一、表结构

    二、实体类

    三、json处理器

    四、配置文件

    五、josn数据

    1、插入

    2、查找


    一、表结构

    1. CREATE TABLE "public"."pg_user" (
    2. "id" int8 NOT NULL GENERATED ALWAYS AS IDENTITY (
    3. INCREMENT 1
    4. MINVALUE 1
    5. MAXVALUE 9223372036854775807
    6. START 1
    7. CACHE 1
    8. ),
    9. "name" varchar(255) COLLATE "pg_catalog"."default",
    10. "age" int4,
    11. "sex" varchar(255) COLLATE "pg_catalog"."default",
    12. "create_time" timestamp(0),
    13. "create_name" varchar(255) COLLATE "pg_catalog"."default",
    14. "update_time" timestamp(0),
    15. "update_name" varchar(255) COLLATE "pg_catalog"."default",
    16. "is_del" varchar(255) COLLATE "pg_catalog"."default" DEFAULT '0'::character varying,
    17. "liu_xi" json,
    18. CONSTRAINT "pg_user_pkey" PRIMARY KEY ("id")
    19. )
    20. ;
    21. ALTER TABLE "public"."pg_user"
    22. OWNER TO "postgres";

    二、实体类

    Entity

    1. package com.chensir.system.domain.entity;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.baomidou.mybatisplus.annotation.*;
    4. import com.chensir.domain.BaseEntity;
    5. import com.chensir.handler.ObjectJsonHandler;
    6. import lombok.Data;
    7. /**
    8. * @author ChenSir
    9. * @Date 2023/9/11
    10. **/
    11. @Data
    12. @TableName(value = "public.pg_user")
    13. public class PgUser extends BaseEntity {
    14. @TableId(value = "id", type = IdType.AUTO)
    15. private Long id;
    16. private String name;
    17. private Integer age;
    18. private String sex;
    19. private JSONObject liuXi;
    20. @TableLogic
    21. private String isDel;
    22. }

    Bo

    1. package com.chensir.system.domain.bo;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.baomidou.mybatisplus.annotation.IdType;
    4. import com.baomidou.mybatisplus.annotation.TableField;
    5. import com.baomidou.mybatisplus.annotation.TableId;
    6. import com.baomidou.mybatisplus.annotation.TableName;
    7. import com.chensir.domain.BaseEntity;
    8. import com.chensir.handler.ObjectJsonHandler;
    9. import lombok.Data;
    10. /**
    11. * @author ChenSir
    12. * @Date 2023/9/11
    13. **/
    14. @Data
    15. public class PgUserBo extends BaseEntity {
    16. private Long id;
    17. private String name;
    18. private Integer age;
    19. private String sex;
    20. private JSONObject liuXi;
    21. }

    Vo

    1. package com.chensir.system.domain.vo;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.baomidou.mybatisplus.annotation.IdType;
    4. import com.baomidou.mybatisplus.annotation.TableField;
    5. import com.baomidou.mybatisplus.annotation.TableId;
    6. import com.baomidou.mybatisplus.annotation.TableName;
    7. import com.chensir.handler.ObjectJsonHandler;
    8. import com.fasterxml.jackson.annotation.JsonFormat;
    9. import lombok.Data;
    10. import org.springframework.format.annotation.DateTimeFormat;
    11. import java.time.LocalDateTime;
    12. /**
    13. * @author ChenSir
    14. * @Date 2023/9/11
    15. **/
    16. @Data
    17. public class PgUserVo {
    18. private Long id;
    19. private String name;
    20. private Integer age;
    21. private String sex;
    22. @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    23. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    24. private LocalDateTime createTime;
    25. private String createName;
    26. @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    27. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    28. private LocalDateTime updateTime;
    29. private String updateName;
    30. private JSONObject liuXi;
    31. }

    三、json处理器

    1. package com.chensir.handler;
    2. import com.alibaba.fastjson.JSONObject;
    3. import org.apache.ibatis.type.BaseTypeHandler;
    4. import org.apache.ibatis.type.JdbcType;
    5. import org.apache.ibatis.type.MappedTypes;
    6. import org.postgresql.util.PGobject;
    7. import java.sql.CallableStatement;
    8. import java.sql.PreparedStatement;
    9. import java.sql.ResultSet;
    10. import java.sql.SQLException;
    11. /**
    12. * pgsql-json处理器
    13. * @author ChenSir
    14. * @Date 2023/9/11
    15. * postgres中json格式的字段,进行转换的自定义转换器,转换为实体类的JSONObject属性
    16. * MappedTypes注解中的类代表此转换器可以自动转换为的java对象
    17. */
    18. @MappedTypes(JSONObject.class) // 会对使用JSONObject类型的字段进行json映射
    19. public class ObjectJsonHandler extends BaseTypeHandler {
    20. //引入PGSQL提供的工具类PGobject
    21. private static final PGobject jsonObject = new PGobject();
    22. @Override
    23. public void setNonNullParameter(PreparedStatement ps, int i, JSONObject param, JdbcType jdbcType) throws SQLException {
    24. //转换的操作在这里!!!
    25. jsonObject.setType("json");
    26. jsonObject.setValue(param.toString());
    27. ps.setObject(i, jsonObject);
    28. }
    29. @Override
    30. public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
    31. String sqlJson = rs.getString(columnName);
    32. if (null != sqlJson) {
    33. return JSONObject.parseObject(sqlJson);
    34. }
    35. return null;
    36. }
    37. //根据列索引,获取可以为空的结果
    38. @Override
    39. public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    40. String sqlJson = rs.getString(columnIndex);
    41. if (null != sqlJson) {
    42. return JSONObject.parseObject(sqlJson);
    43. }
    44. return null;
    45. }
    46. @Override
    47. public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    48. String sqlJson = cs.getString(columnIndex);
    49. if (null != sqlJson) {
    50. return JSONObject.parseObject(sqlJson);
    51. }
    52. return null;
    53. }
    54. }
    1. org.postgresql
    2. postgresql
    3. 42.2.14

    四、配置文件

    使用jsonObject需要在Mybatis-plus添加json处理器包路径

      type-handlers-package: com.chensir.handler

    五、josn数据

    1. {
    2. "createtime": "2020-08-06T03:57:08.382Z",
    3. "dataid": "727d2094-f6b3-4eee-a39b-7544c04105fc",
    4. "schemaid": "ec9ebd79-d74d-4e0f-b026-9653006940f2",
    5. "items": {"product": "Toy Train","qty": 2}
    6. }

    1、插入

    INSERT INTO public.pg_user ( liu_xi ) VALUES ( {"createtime":"2020-08-06T03:57:08.382Z","dataid":"727d2094-f6b3-4eee-a39b-7544c04105fc","schemaid":"ec9ebd79-d74d-4e0f-b026-9653006940f2","items": {"product": "Toy Train","qty": 2}} )

    2、查找

    1、使用select语句查找json数据,与其他基本类型类似

    select * from public.pg_user

    2、查询json中所有dataid作为键

    1. select
    2. liu_xi -> 'dataid' as dataid
    3. from
    4. public.pg_user

    3、查询json中所有dataid作为文本

    1. select
    2. liu_xi ->> 'dataid' as dataid
    3. from
    4. public.pg_user

    4、->操作返回json对象,可以链式调用 ->>返回特定节点。

    先使用liu_xi-> 'items' 返回对象。然后使用liu_xi -> 'items' ->> 'product' 返回所有产品文本值。

    1. select
    2. liu_xi -> 'items' ->> 'product' as product
    3. from
    4. public.pg_user
    5. order by
    6. product

    where查询略

    可参考:

    PostgreSQL JSON数据类型_postgis geojson字段类型_梦想画家的博客-CSDN博客

  • 相关阅读:
    【每日一题】力扣1768. 交替合并字符串
    护肤品微商怎么找人脉资源
    【23】线程相关扩展习题
    设计一个简单的通讯录
    MySQL练习题
    操作系统知识点总结——第一章计算机系统概述
    Java 两个线程实现生产者和消费者的问题
    2.5 晶体管单管放大电路的三种基本接法
    最佳云存储平台推荐:安全可靠的选择解析
    monodepth2学习1-原理介绍
  • 原文地址:https://blog.csdn.net/weixin_45326523/article/details/132829858