Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用iBatis将int[]插入PostgreSql_Java_Postgresql_Ibatis - Fatal编程技术网

Java 使用iBatis将int[]插入PostgreSql

Java 使用iBatis将int[]插入PostgreSql,java,postgresql,ibatis,Java,Postgresql,Ibatis,。。。在iBatis的帮助下,有没有一种简单的方法可以将Java int[]插入PostgreSql?(旧的,不是新的MyBatis) 我不确定是否需要自定义类型处理程序,但我很难找到一个代码示例来说明发生了什么 提前谢谢 附言: 自从最初发布以来,我能够从DB读取数组并在域对象中填充int[]。但无法写入数据库:-( 因此,在域模型中有: int[] crap = null; 对于getter和setter,cusom属性处理程序如下所示: public class ArrayTypeHan

。。。在iBatis的帮助下,有没有一种简单的方法可以将Java int[]插入PostgreSql?(旧的,不是新的MyBatis)

我不确定是否需要自定义类型处理程序,但我很难找到一个代码示例来说明发生了什么

提前谢谢

附言:

自从最初发布以来,我能够从DB读取数组并在域对象中填充int[]。但无法写入数据库:-(

因此,在域模型中有:

int[] crap = null;
对于getter和setter,cusom属性处理程序如下所示:

public class ArrayTypeHandler implements TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {

    if( parameter == null){
        setter.setNull( Types.ARRAY);
    } else {
        setter.setArray( (Array) Arrays.asList(parameter ) );
    }

}

public Object getResult(ResultGetter getter) throws SQLException {
    Array array = getter.getResultSet().getArray(getter.getColumnName());
    if( !getter.getResultSet().wasNull()){
         return array.getArray();
    } else { return null; }

}

public Object valueOf(String string) {
    throw new UnsupportedOperationException("Not supported yet.");
}
}

sqlMapConfig.xml:

<typeHandler javaType="java.sql.Array" jdbcType="ARRAY" callback="project.persistance.sqlmapdao.ArrayTypeHandler"  />
---该错误出现在project/persistence/sql\u xml/Article.xml中。
---应用参数映射时出错。
---检查LineParameterMap中的updateArticle。
---检查'crap'属性的参数映射。
---原因:java.lang.NullPointerException;嵌套异常为com.ibatis.common.jdbc.exception.NestedSQLException:
---该错误出现在project/persistence/sql\u xml/Article.xml中。
---应用参数映射时出错。
---检查LineParameterMap中的updateArticle。
---检查'crap'属性的参数映射。
---原因:java.lang.NullPointerException

…有没有关于我遗漏了什么的线索? 谢谢

===

…我一直努力到ClassCasteException:-)

正在尝试设置属性:

    public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
    int[] c = (int[]) parameter;

    setter.setArray( (java.sql.Array) c  );
}
。。。以及随之而来的例外:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];   
---该错误出现在project/persistence/sql\u xml/Article.xml中。
---应用参数映射时出错。
---检查LineParameterMap中的updateArticle。
---检查'crap'属性的参数映射。
---原因:java.lang.ClassCastException:java.util.ArrayList;嵌套异常是com.ibatis.common.jdbc.exception.NestedSQLException:
---该错误出现在project/persistence/sql\u xml/Article.xml中。
---应用参数映射时出错。
---检查LineParameterMap中的updateArticle。
---检查'crap'属性的参数映射。
---原因:java.lang.ClassCastException:java.util.ArrayList

。。。不过我今天吃过了。 谢谢

这看起来很有希望:


根据Jeremy回答中引用的页面,我不久前已经编写了自己的处理程序(使用了一些黑客)。如果您觉得它有用:

public class ArrayIntsTypeHandlerCallback implements TypeHandlerCallback {

     /**
      * to write an integer array in db. Object should be Integer[]
      */    
      public void setParameter(ParameterSetter setter, Object parameter) throws SQLException  {
          Connection con = setter.getPreparedStatement().getConnection();
          // hack: if using poolable connection from dbcp must get inside true connection! 
          if(con instanceof org.apache.commons.dbcp.PoolableConnection ) {
              con =     ((org.apache.commons.dbcp.PoolableConnection)con).getInnermostDelegate();
          }
          Array array = con.createArrayOf("integer", (Object[])parameter);
          setter.setArray(array);
        }

      /**
       * read integer array from db. returns Integer[]
       */
      public Object getResult(ResultGetter getter) throws SQLException {
        Array array = getter.getArray();
        if (!getter.getResultSet().wasNull()) {
          return array.getArray();
        } else {
          return null;
        }
      }

      public Object valueOf(String s) {
        throw new UnsupportedOperationException("Not implemented");
      }


    }

。。。终于明白了。以下是它从一开始的过程:

。。。第一:

。。。第二:第二,在搜索和四处走动时,发现了一个(仅限JDK1.6)并在一个网站上发布

TypeHandlerCallbac iterface中setParameter方法的最终实现:

    public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
    setter.setArray( this.convertIntegerToPgSqlArray( (int[]) parameter ) );
}

...

    private java.sql.Array convertIntegerToPgSqlArray(final int[] p) {
    if (p == null || p.length < 1) {
        return null;
    }
    Array a = new Array() {

        public String getBaseTypeName() {
            return "int4";
        }

        public int getBaseType() {
            return 0;
        }

        public Object getArray() {
            return null;
        }

        public Object getArray(Map<String, Class<?>> map) {
            return null;
        }

        public Object getArray(long index, int count) {
            return null;
        }

        public Object getArray(long index, int count, Map<String, Class<?>> map) {
            return null;
        }

        public ResultSet getResultSet() {
            return null;
        }

        public ResultSet getResultSet(Map<String, Class<?>> map) {
            return null;
        }

        public ResultSet getResultSet(long index, int count) {
            return null;
        }

        public ResultSet getResultSet(long index, int count,
            Map<String, Class<?>> map) {
            return null;
        }

        public String toString() {
            String fp = "{";
            if (p.length == 0) {
            } else {
                for (int i = 0; i < p.length - 1; i++) {
                    fp += p[i] + ",";
                }
                fp += p[p.length - 1];
            }
            fp += "}";
            return fp;
        }
    };
        return a;
}
public void setParameter(参数设置器、对象参数)抛出SQLException{
seter.setArray(此.convertIntegerTopGSQLARY((int[])参数));
}
...
私有java.sql.Array转换器integertopgsqlarray(final int[]p){
如果(p==null | | p.length<1){
返回null;
}
数组a=新数组(){
公共字符串getBaseTypeName(){
返回“int4”;
}
public int getBaseType(){
返回0;
}
公共对象getArray(){
返回null;
}
公共对象getArray(映射>映射){
返回null;
}
公共结果集getResultSet(){
返回null;
}
公共结果集getResultSet(映射>映射){
返回null;
}
公共字符串toString(){
字符串fp=“{”;
如果(p.length==0){
}否则{
对于(int i=0;i
最后,感谢大家,并希望这能为其他人节省一些时间:-)

PS:作为最后的参考,当我把这个问题贴到MyBatis邮件列表上时,我得到了以下信息:

这有几个问题

  • Arrays.asList()不适用于基元数组。请看这里:

    对于我们在MyBatis 3中处理基元数组所做的更改

  • 然后,您可能无法将java.util.List强制转换为java.sql.Array。 要创建java.sql.Array,您需要使用 或者切换到JDK6并使用 createArrayOf(…)方法

  • JDBC中对数组类型的支持完全是一团糟,把它和
    原语数组增加了另一层混乱:)

    要在一行或多行中插入
    int[]
    吗?一行中,列类型为整数[]。。。似乎正是我一直在寻找的,会给它一个旋转,谢谢!。。。这是仅适用于JDK1.6还是与JDK1.5兼容?IIRC
    createArrayOf
    随JDBC-4提供,JDK1.6随附
        public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
        setter.setArray( this.convertIntegerToPgSqlArray( (int[]) parameter ) );
    }
    
    ...
    
        private java.sql.Array convertIntegerToPgSqlArray(final int[] p) {
        if (p == null || p.length < 1) {
            return null;
        }
        Array a = new Array() {
    
            public String getBaseTypeName() {
                return "int4";
            }
    
            public int getBaseType() {
                return 0;
            }
    
            public Object getArray() {
                return null;
            }
    
            public Object getArray(Map<String, Class<?>> map) {
                return null;
            }
    
            public Object getArray(long index, int count) {
                return null;
            }
    
            public Object getArray(long index, int count, Map<String, Class<?>> map) {
                return null;
            }
    
            public ResultSet getResultSet() {
                return null;
            }
    
            public ResultSet getResultSet(Map<String, Class<?>> map) {
                return null;
            }
    
            public ResultSet getResultSet(long index, int count) {
                return null;
            }
    
            public ResultSet getResultSet(long index, int count,
                Map<String, Class<?>> map) {
                return null;
            }
    
            public String toString() {
                String fp = "{";
                if (p.length == 0) {
                } else {
                    for (int i = 0; i < p.length - 1; i++) {
                        fp += p[i] + ",";
                    }
                    fp += p[p.length - 1];
                }
                fp += "}";
                return fp;
            }
        };
            return a;
    }