java mybatis如何操作postgresql array数组类型

作者:libraryhu 时间:2023-04-25 22:59:37 

找了半天没有找到postgresql中关于array数组类型的字段如何对应到java中的数据类型,后来找到了mybatis的TypeHandler,只要实现一个自定义的TypeHandler就行了,如下,

我定义了几个基础数据类型的数组

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 ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
       String typeName = null;
       if (parameter instanceof Integer[]) {
           typeName = TYPE_NAME_INTEGER;
       } else if (parameter instanceof String[]) {
           typeName = TYPE_NAME_VARCHAR;
       } else if (parameter instanceof Boolean[]) {
           typeName = TYPE_NAME_BOOLEAN;
       } else if (parameter instanceof Double[]) {
           typeName = TYPE_NAME_NUMERIC;
       }
       if (typeName == null) {
           throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
       }
       // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
       Connection conn = ps.getConnection();
       Array array = conn.createArrayOf(typeName, parameter);
       ps.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;
   }
}

然后在实体类里面对应的字段配置这个转换器就行,如果是配置文件需要在 xxmap.xml中配置对应属性

@ColumnType(typeHandler = com.mvc.typehandler.ArrayTypeHandler.class)
private String[] cities; //所操作的城市code列表,为空表示所有城市
@ColumnType(typeHandler = com.mvc.typehandler.ArrayTypeHandler.class)
private String[] areaTypes; //操作的行业类型code列表,为空表示所有行业
@ColumnType(typeHandler = com.jmtool.mvc.typehandler.ArrayTypeHandler.class)
private Integer[] targetStatus; //操作的目标数据状态

java mybatis操作 postgresql array数组类型备忘

postgrey sql数据库字段类型varchar[],java使用String[]类型,自定义ArrayTypeHandler

ArrayTypeHandler.java

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 ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
       String typeName = null;
       if (parameter instanceof Integer[]) {
           typeName = TYPE_NAME_INTEGER;
       } else if (parameter instanceof String[]) {
           typeName = TYPE_NAME_VARCHAR;
       } else if (parameter instanceof Boolean[]) {
           typeName = TYPE_NAME_BOOLEAN;
       } else if (parameter instanceof Double[]) {
           typeName = TYPE_NAME_NUMERIC;
       }
       if (typeName == null) {
           throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
       }
       // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
       Connection conn = ps.getConnection();
       Array array = conn.createArrayOf(typeName, parameter);
       ps.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;
   }
}

配置文件中映射配置,增加typeHandler属性,填写ArrayTypeHandler.java的全路径。

<result column="source_type" jdbcType="ARRAY" property="sourceType" typeHandler="com.wang.common.ArrayTypeHandler" />

用到的SQL:

<insert id="insert" parameterType="com.wang.pojo.Qzf">
    insert into t_qz_qzf(id,source_type)
    values
    (#{id,jdbcType=VARCHAR},#{sourceType,jdbcType=ARRAY,typeHandler="com.wang.common.ArrayTypeHandler"})
</insert>

来源:https://blog.csdn.net/libraryhu/article/details/71141793

标签:java,mybatis,postgresql,array
0
投稿

猜你喜欢

  • JAVA如何定义构造函数过程解析

    2023-11-04 08:15:09
  • 一文总结Java获取文件后缀名的所有方法

    2022-10-18 16:06:40
  • Java三目运算中隐藏的自动拆装箱

    2023-11-29 10:47:10
  • Spring @Transaction 注解执行事务的流程

    2022-12-30 15:41:23
  • c# BackgroundWorker使用方法

    2021-05-27 00:49:12
  • 基于C#实现语音识别功能详解

    2023-07-12 18:55:24
  • springboot 整合 seata的配置过程

    2023-01-13 01:28:33
  • Spring Boot中操作使用Redis实现详解

    2023-11-24 02:39:29
  • Android基于opencv实现多通道分离与合并

    2022-05-04 09:49:29
  • Android控件实现图片缩放功能

    2022-06-10 15:59:27
  • C#简单实现防止多个程序运行的方法

    2021-07-31 04:36:27
  • 使用JVM常用GC日志打印参数

    2021-09-06 17:36:41
  • Android开发之开关按钮控件ToggleButton简单用法示例

    2022-12-30 22:05:43
  • 老生常谈Java动态编译(必看篇)

    2022-04-02 14:19:38
  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法

    2021-10-18 08:01:29
  • Android引导页面的简单实现

    2023-08-06 04:24:32
  • android使用flutter的ListView实现滚动列表的示例代码

    2023-06-26 09:00:13
  • C# 在PDF中添加墨迹注释Ink Annotation的步骤详解

    2022-01-31 14:23:29
  • 一键清除maven仓库中下载失败的jar包的实现方法

    2023-08-13 03:43:59
  • spring boot使用logback实现多环境日志配置详解

    2022-10-03 20:38:24
  • asp之家 软件编程 m.aspxhome.com