mybatis建立插入postgresql的json类型数据的方法

 更新时间:2025年07月24日 08:53:42   作者:ljbguanli  
本文介绍如何通过自定义MyBatis JSON处理器,解决将JSON数据插入PostgreSQL json字段时的报错问题,实现成功插入,感兴趣的朋友一起看看吧

一、前言

最近在开发需求时,需要将json类型的表字段插入数据库,而针对postgresql数据库,如果直接插入json字符串会报错,那么针对这种情况,在不使用xml语句使用函数CAST强转情况下,想要实现插入json类型的数据,那么就可以在java 字段上加入自定义json处理器,就可以实现了。

二、如何实现?

1.在定义的entity对象中,针对json类型字段添加注解实现自定义json处理器,例如:

@Data
public class SyncLog implements Serializable {
  @TableId(type= IdType.INPUT)
  private Long id;
  @TableField(value = "content",typeHandler = JsonTypeHandler.class)
  private Object content;
  /**
  * 创建时间
  */
  private Date createTime;
  private static final long serialVersionUID = 1L;
}

其中content在数据库中是json类型。

2.JsonTypeHandler类实现如下:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;
import java.sql.*;
public class JsonTypeHandler extends BaseTypeHandler {
  private static final ObjectMapper objectMapper = new ObjectMapper();
  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
    String jsonString;
    try {
      if(parameter instanceof String){
        jsonString = (String) parameter;
      }else {
        jsonString = objectMapper.writeValueAsString(parameter);
      }
    } catch (JsonProcessingException e) {
      throw new SQLException("JsonTypeHandler JSON serialization error", e);
    }
    // 获取数据库类型
    Connection connection = ps.getConnection();
    DatabaseMetaData metaData = connection.getMetaData();
    String databaseProductName = metaData.getDatabaseProductName().toLowerCase();
    if (databaseProductName.contains("postgresql")) {
      PGobject pgObject = new PGobject();
      pgObject.setType("json"); // 或者 "jsonb" 根据需求
      pgObject.setValue(jsonString);
      ps.setObject(i, pgObject);
    } else {
      //其他数据库处理逻辑
      ps.setString(i, jsonString);
    }
  }
  @Override
  public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return parseJson(rs.getString(columnName));
  }
  @Override
  public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return parseJson(rs.getString(columnIndex));
  }
  @Override
  public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return parseJson(cs.getString(columnIndex));
  }
  private Object parseJson(String json) throws SQLException {
    if (json == null) {
      return null;
    }
    try {
      return objectMapper.readTree(json);
    } catch (Exception e) {
      throw new SQLException("JsonTypeHandler JSON deserialization error", e);
    }
  }
}

3.接下来定义一个DAO。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SyncLogDao extends BaseMapper {
}

4.然后插入一条数据,如果可以插入这条json数据,表明自定义的JsonTypeHandler已生效。

@RunWith(SpringRunner.class)
@SpringBootTest(classes= AIAssetExternalApplication.class)
public class IntegrationTest {
  @Autowired
  SyncLogDao syncLogDao;
  @Test
  public void sync() throws Exception {
    SyncLog syncLog = new SyncLog();
    syncLog.setId(1L);
    String jsonStr="{\"size\": 3474046}";
    syncLog.setContent(jsonStr);
    syncLogDao.insert(syncLog);
  }
}

结果插入成功,自定义的JsonTypeHandler生效。

到此这篇关于mybatis建立插入postgresql的json类型数据的文章就介绍到这了,更多相关mybatis json类型数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Swagger实现接口版本号管理方式

    使用Swagger实现接口版本号管理方式

    这篇文章主要介绍了使用Swagger实现接口版本号管理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 如何将文件流转换成byte[]数组

    如何将文件流转换成byte[]数组

    这篇文章主要介绍了如何将文件流转换成byte[]数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • springboot neo4j的配置代码

    springboot neo4j的配置代码

    小编最近的工作中遇到了一些知识图谱的工作,自然就用到了图数据库,这一NoSQL 数据库可以很好的展示节点之间的关联关系,对于一些图谱的关系操作是很好的选择,下面来介绍下 Springboot 配置Neo4J的问题
    2021-12-12
  • SpringCloud入门实验环境搭建

    SpringCloud入门实验环境搭建

    这篇文章主要介绍了SpringCloud入门实验环境搭建的相关资料,帮助大家更好的理解和学习使用SpringCloud,感兴趣的朋友可以了解下
    2021-04-04
  • 使用@Service注解出现No bean named 'xxxx' available]错误的解决

    使用@Service注解出现No bean named 'xxxx'&

    这篇文章主要介绍了使用@Service注解出现No bean named 'xxxx' available]错误的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 如何利用Ganymed SSH-2模拟SSH操作

    如何利用Ganymed SSH-2模拟SSH操作

    这几天看SFTP资料时,无意中看到了Ganymed SSH-2,写了个简单demo,通过,感觉挺好用的,下面就和大家分享下。需要的朋友可以过来参考参考
    2013-08-08
  • JavaWeb之Filter与Listener使用解析

    JavaWeb之Filter与Listener使用解析

    这篇文章主要介绍了JavaWeb之Filter与Listener使用解析,Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一,过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能,需要的朋友可以参考下
    2024-01-01
  • Spring Boot Logback配置日志过程解析

    Spring Boot Logback配置日志过程解析

    这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 使用SpringBoot+nmap4j获取端口信息的代码详解

    使用SpringBoot+nmap4j获取端口信息的代码详解

    这篇文章主要介绍了使用 SpringBoot + nmap4j 获取端口信息,包括需求背景、nmap4j 的相关介绍、代码说明(含测试代码、改造后的代码及参数说明),还提到了文件读取方式和依赖引入方式,最终请求能获取到数据,需要的朋友可以参考下
    2025-01-01
  • Java拦截器Interceptor实现原理及代码示例

    Java拦截器Interceptor实现原理及代码示例

    本文详细讲解了Java拦截器Interceptor实现原理及代码示例,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论