欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

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

2025年08月23日 Java
一、前言最近在开发需求时,需要将json类型的表字段插入数据库,而针对postgresql数据库,如果直接插入json字符串会报错,那么针对这种情况,在不使用xml语句使用函数cast强转情况下,想要

一、前言

最近在开发需求时,需要将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类型数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!