mybatis+postgresql创建表,插入数组和jsonb数据
·
建表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
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)