建表mapper:

  <update id="createTable">
        create table ${tableName}(
        id varchar(32) primary key ,
        key_id text[],
        err_flag boolean,
        err_msg varchar(3000),
        content jsonb,
        create_time timestamp(6)
        )
    </update>

实体类:

@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "日志对象")
public class Log implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "id")
    private String id;
    @ApiModelProperty(value = "主键id")
    private String[] keyId;
    @ApiModelProperty(value = "记录内容,jsonb 格式")
    private JSONArray content; //存入数据库是jsonb
    @ApiModelProperty(value = "插入出错")
    private Boolean errFlag;
    @ApiModelProperty(value = "出错原因")
    private String errMsg;

    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "同步时间")
    private java.util.Date createTime;

    public Map<String,Object> toMap(){
        Map<String,Object> map = new HashMap<>();
        map.put("id",this.id);
        map.put("keyId",this.keyId);
        map.put("errFlag",this.errFlag);
        map.put("errMsg",this.errMsg);
        map.put("content",this.content);
        map.put("createTime",new Date());
        return map;
    }
}

插入数据:

 public void add(String tableName, Log log) {
        String sql = "insert into " + tableName + "(id,key_id,err_flag,err_msg,content,create_time) " +
                "values(#{p.id}," +
                "#{p.keyId,typeHandler=org.jeecg.modules.data.common.util.ArrayTypeHandler}," +
                "#{p.errFlag},#{p.errMsg}," +
                "#{p.content,typeHandler=org.jeecg.modules.data.common.util.JsonArrayTypeHandler}," +
                "#{p.createTime})";
        mapper.add(sql, log.toMap());
    }

数组类型处理 ArrayTypeHandler:

package org.jeecg.modules.data.common.util;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeException;

import java.sql.*;

/**
 * postgresql array类型处理程序
 */
public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {
    private static final String TYPE_NAME_VARCHAR = "varchar";
    private static final String TYPE_NAME_INTEGER = "integer";
    private static final String TYPE_NAME_BOOLEAN = "boolean";
    private static final String TYPE_NAME_NUMERIC = "numeric";

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object[] objects, JdbcType jdbcType) throws SQLException {
        String typeName = null;
        if (objects instanceof Integer[]) {
            typeName = TYPE_NAME_INTEGER;
        } else if (objects instanceof String[]) {
            typeName = TYPE_NAME_VARCHAR;
        } else if (objects instanceof Boolean[]) {
            typeName = TYPE_NAME_BOOLEAN;
        } else if (objects instanceof Double[]) {
            typeName = TYPE_NAME_NUMERIC;
        }

        if (typeName == null) {
            throw new TypeException("未能处理的数组类型,参数类型是:" + objects.getClass().getName());
        }
        Connection conn = preparedStatement.getConnection();
        Array array = conn.createArrayOf(typeName, objects);
        preparedStatement.setArray(i, array);
    }

    @Override
    public Object[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return  getArray(resultSet.getArray(s));
    }

    @Override
    public Object[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return  getArray(resultSet.getArray(i));
    }

    @Override
    public Object[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return  getArray(callableStatement.getArray(i));
    }

    private Object[] getArray(Array array) {
        if (array == null) {
            return null;
        }
        try {
            return (Object[]) array.getArray();
        } catch (Exception e) {
        }
        return null;
    }

}

json数据处理程序JsonArrayTypeHandler:

package org.jeecg.modules.data.common.util;

import cn.hutool.json.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(JSONArray.class)
public class JsonArrayTypeHandler extends BaseTypeHandler<com.alibaba.fastjson.JSONArray> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, com.alibaba.fastjson.JSONArray objects, JdbcType jdbcType) throws SQLException {
        if (preparedStatement != null) {
            PGobject ext = new PGobject();
            ext.setType("jsonb");
            ext.setValue(objects.toString());
            preparedStatement.setObject(i, ext);
        }
    }

    @Override
    public com.alibaba.fastjson.JSONArray getNullableResult(ResultSet resultSet, String s) throws SQLException {
        String sqlJson = resultSet.getString(s);
        if (null != sqlJson){
            return JSONObject.parseArray(sqlJson);
        }
        return null;
    }

    @Override
    public com.alibaba.fastjson.JSONArray getNullableResult(ResultSet resultSet, int i) throws SQLException {
        String sqlJson = resultSet.getString(i);
        if (null != sqlJson){
            return JSONObject.parseArray(sqlJson);
        }
        return null;
    }

    @Override
    public com.alibaba.fastjson.JSONArray getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        String sqlJson = callableStatement.getString(i);
        if (null != sqlJson){
            return JSONObject.parseArray(sqlJson);
        }
        return null;
    }
}

json格式的处理程序同jsonarray

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐