PG数据库制造JSON数据并通过mybatis 进行Json参数处理

文章介绍了如何在PostgreSQL中使用json_build_object和json_agg函数操作JSON对象,以及在MyBatis中如何通过personJsonTypeHandler处理返回的JSON数据,包括XML映射文件和字段注解的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录 :

pg数据库函数:

 json_build_object():可将多个字段合并成一个 JSON 对象

例:

转换前:

SELECT json_build_object(nickname,username) FROM system_users

转换后:

json_agg():是一个聚合函数,它返回一个包含了一个分组中的所有的值的组成的 JSON 数组

例:

select json_agg(json_build_object(nickname,username))FROM system_users

 结果:[{"姓名" : "xingming"}, {"源码" : "yuanma"}, {"测试号" : "test"}, {"admin" : "admin123"}]

mybaits 处理参数:

@MappedTypes(JSONObject.class)
public class personJsonTypeHandler extends BaseTypeHandler<JSONObject> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, JSONObject objects, JdbcType jdbcType) throws SQLException {

    }
    
    @Override
    public JSONObject getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        // 处理sql返回json进行转换
        String sqlJson = resultSet.getString(columnName);
        if (!sqlJson.isEmpty()){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }

    @Override
    public JSONObject getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return null;
    }

    @Override
    public JSONObject getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return null;
    }
}

xml中 sql语句返回结果需用resultMap接收,接收json数据字段需加typeHandler:

<resultMap type="com.xx.xx.xx.vo.PersonCountVo" id="PersonCountVo">
        <result property="jsonMap" column="jsonMap" typeHandler="com.xx.xx.xx.personJsonTypeHandler" />
</resultMap>

字段添加注解 :

@TableField(value="jsonData",typeHandler = personJsonTypeHandler.class)

### MyBatis 使用 PostgreSQL 引用类型的最佳实践 #### 配置数据源 为了使应用程序能够访问 PostgreSQL 数据库,需正确配置 `application.properties` 文件中的数据源属性。确保 URL、用户名、密码以及驱动类名称都设置无误,注意字符串结尾不应有多余空格[^4]。 ```properties spring.datasource.url=jdbc:postgresql://localhost:5432/testscmdb?useSSL=false spring.datasource.username=dbuser spring.datasource.password=123 spring.datasource.driver-class-name=org.postgresql.Driver ``` #### 定义实体类支持 JSON/JSONB 字段映射 当涉及到处理 PostgreSQL 特定的数据类型如 `json` 或者更推荐使用的 `jsonb` 时,可以通过定义 Java 实体类来表示这些列。对于这种复杂结构化数据的支持,通常会借助 Jackson 库来进行序列化和反序列化操作[^1]。 ```java import com.fasterxml.jackson.databind.JsonNode; // ... private JsonNode jsonData; // 对应于表里的 json/jsonb 列 ``` #### 创建自定义 TypeHandler 为了让 MyBatis 能够理解适当地转换上述提到的特殊字段(比如 `JsonNode`),应当编写相应的 `TypeHandler` 来实现这一点。这允许开发者控制读写过程中的行为,从而更好地兼容目标数据库特性[^2]。 ```java @MappedTypes(JsonNode.class) public class JsonNodeTypeHandler extends BaseTypeHandler<JsonNode> { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, JsonNode parameter, JdbcType jdbcType) throws SQLException { String jsonString = objectMapper.writeValueAsString(parameter); ps.setObject(i, jsonString, Types.OTHER); // OTHER 表示非标准 SQL 类型 } @Override public JsonNode getNullableResult(ResultSet rs, String columnName) throws SQLException { String jsonString = rs.getString(columnName); try { return StringUtils.isEmpty(jsonString) ? null : objectMapper.readTree(jsonString); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e.getCause()); } } // ...其他方法省略... } ``` #### 注册 TypeHandler 至全局或局部作用域 完成自定义处理器之后,则需要将其注册给 MyBatis 框架以便实际应用起来。可以在 XML 映射文件中指定特定语句使用该 handler;也可以通过全局方式让整个项目默认采用此策略[^3]。 ```xml <!-- 局部 --> <select id="selectUserById" resultMap="BaseResultMap"> SELECT * FROM users WHERE id=#{id} AND data_type_handler=com.example.JsonNodeTypeHandler </select> <!-- 全局 --> <typeHandlers> <typeHandler javaType="com.fasterxml.jackson.databind.JsonNode" handler="com.example.JsonNodeTypeHandler"/> </typeHandlers> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值