如何使用mybatis向postgresql插入数组值

0h4hbjxa  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(693)

我的班级

class PgFolder {
    long id;
    int[] pgFeature;
}
getter...
setter...

我的table

CREATE TABLE folder {
    ID BIGSERIAL PRIMARY KEY,
    feature INT[]
}

我的xml

<insert id="insertManyFolder" parameterType="java.util.List">
    INSERT INTO
        folder
       (feature)
        VALUES
        <foreach collection="list" item="item" index="" separator=",">
            (#{item.pgFeature})
        </foreach>
</insert>

我想插入一个 List<PgFolder> 列表。列表中有许多pgfolder示例。当我运行程序时,出现了一个错误:
org.apache.ibatis.exceptions.persistenceexception:
更新数据库时出错。原因:java.lang.illegalstateexception:属性“\uu frch\u item\u 0.pgfeature”的参数Map上的类型处理程序为null。没有为javatype(java.util.list):jdbctype(null)组合指定和/或找不到它。
原因:java.lang.illegalstateexception:属性“\uu frch\u item\u 0.pgfeature”的参数Map上的类型处理程序为null。没有为javatype(java.util.list):jdbctype(null)组合指定和/或找不到它**
为什么我收到这个错误信息?如何正确插入数组值?如果我在postgres客户机中使用sql,我可以插入一个数组值。所以我安装的版本的postgres可以支持数组值。

zazmityj

zazmityj1#

我将解释两种解决方案,即Map Integer[] 属性和Map int[] 财产。

Map整数[]

class PgFolder {
  long id;
  Integer[] pgFeature;
  // getter / setter
}

在这种情况下,可以使用mybatis的内置 ArrayTypeHandler .
指定 typeHandler 在参数参考中是足够的。

<foreach ...>
  (#{item.pgFeature,typeHandler=org.apache.ibatis.type.ArrayTypeHandler})
</foreach>

Mapint[]

作为内置 ArrayTypeHandler 可能无法使用基元数组,您可能必须编写自定义类型处理程序。例如

package pkg;

import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

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

public class PgIntArrayTypeHandler extends BaseTypeHandler<int[]>{
  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, int[] parameter, JdbcType jdbcType)
      throws SQLException {
    ps.setObject(i, parameter);
  }

  @Override
  public int[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return extractArray(rs.getArray(columnName));
  }

  @Override
  public int[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return extractArray(rs.getArray(columnIndex));
  }

  @Override
  public int[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return extractArray(cs.getArray(columnIndex));
  }

  protected int[] extractArray(Array array) throws SQLException {
    if (array == null) {
      return null;
    }
    // pgjdbc returns Integer[] for the INT[] column
    Integer[] wrapperArray = (Integer[]) array.getArray();
    int[] result = Arrays.stream(wrapperArray).mapToInt(Integer::intValue).toArray();
    array.free();
    return result;
  }
}

然后在参数引用中指定类型处理程序。

<foreach ...>
  (#{item.pgFeature,typeHandler=pkg.PgIntArrayTypeHandler})
</foreach>

用mybatis 3.5.5和pgjdbc 42.2.15测试。

相关问题