在 PostgreSQL 中使用 JSONB 类型并结合 MyBatis-Plus 实现自动注入,主要有以下几种方案

在 PostgreSQL 中使用 JSONB 类型并结合 MyBatis-Plus 实现自动注入,主要有以下几种方案:

1. 创建 JSONB TypeHandler

java 复制代码
@MappedTypes({Map.class, List.class, Object.class})
@MappedJdbcTypes(JdbcType.OTHER)
public class JsonbTypeHandler extends BaseTypeHandler<Object> {
    
    private static final ObjectMapper objectMapper = new ObjectMapper();
    
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, 
                                    Object parameter, JdbcType jdbcType) 
                                    throws SQLException {
        try {
            String json = objectMapper.writeValueAsString(parameter);
            ps.setObject(i, json, Types.OTHER);
        } catch (JsonProcessingException e) {
            throw new SQLException("JSON转换失败", e);
        }
    }
    
    @Override
    public Object getNullableResult(ResultSet rs, String columnName) 
                                    throws SQLException {
        String json = rs.getString(columnName);
        return parseJson(json);
    }
    
    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) 
                                    throws SQLException {
        String json = rs.getString(columnIndex);
        return parseJson(json);
    }
    
    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) 
                                    throws SQLException {
        String json = cs.getString(columnIndex);
        return parseJson(json);
    }
    
    private Object parseJson(String json) throws SQLException {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        try {
            return objectMapper.readValue(json, Object.class);
        } catch (Exception e) {
            throw new SQLException("JSON解析失败: " + json, e);
        }
    }
}

2. 实体类配置

java 复制代码
@Data
@TableName(value = "your_table", autoResultMap = true)
public class YourEntity {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String name;
    
    // 方式1:使用泛型
    @TableField(typeHandler = JsonbTypeHandler.class)
    private Map<String, Object> attributes;
    
    // 方式2:指定具体类型
    @TableField(typeHandler = JsonbTypeHandler.class)
    private List<String> tags;
    
    // 方式3:自定义对象
    @TableField(typeHandler = JsonbTypeHandler.class)
    private Config config;


    @TableField(typeHandler = JsonbTypeHandler.class)
    private List<Config> configs;

	public void setConfigs(List configs) {

		if(CollUtil.isEmpty(configs)){
			return;
		}

		Object first = configs.getFirst();
		if(first instanceof Map){
			this.configs= JSONUtil.toList(JSONUtil.toJsonStr(configs), Config.class);
		}
	}



}
复制代码
复制代码
复制代码
相关推荐
jiushidt11 分钟前
在 DBeaver 中为 SQLite 启用 SpatiaLite
数据库·sqlite
码士集团小青30 分钟前
Google 开源了啥,让 AI Agent 碰数据库不再是定时炸弹
数据库·oracle
CS创新实验室1 小时前
数据库突然断电,凭什么没丢数据?——WAL 日志与崩溃恢复
数据库·mysql
Warolitbos1 小时前
【数据库】SQL面试基础15题,测试/开发必背速查
数据库
ClouGence1 小时前
开源数据库管理工具 CloudDM 新版本上线,新增 AI SQL 助手,支持 Elasticsearch、崖山数据库
数据库·sql·elasticsearch
kele_z2 小时前
手工修改数据库中的数据时,我会加的四道保险
mysql·postgresql
ly76892 小时前
PostgreSQL 执行计划深读:从 EXPLAIN 输出到代价模型驱动的 SQL 改写
数据库·sql·postgresql·explain·执行计划·代价模型
Python自动化直播2 小时前
自动化笔记:素材管理、命名、轮换的几条土办法
linux·运维·数据库
xiaomuzuirenzhen2 小时前
2027校招ERP实施顾问:大数据管理与应用专业如何用SQL、BI证明业务能力
大数据·数据库
底层玩家老张3 小时前
从副本集到分片:百亿级文档数据的KES架构边界
数据库·分布式架构·分片·架构选型·文档数据库