...有一种简单的方法可以在iBatis的帮助下将Java int []插入到PostgreSql中吗? (较旧的,而不是新的MyBatis)
不确定我是否需要自定义类型处理程序,但是我很难找到可以说明正在发生的事情的代码示例。
提前致谢。
PS:
自原始发布以来,我能够从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" />
尝试更新时,我收到以下错误:
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];
---项目/ persistance / sql_xml / Article.xml中发生错误
---应用参数图时发生错误
---检查updateArticle-InlineParameterMap
---检查'crap'属性的参数映射
---原因:java.lang.NullPointerException;嵌套异常是com.ibatis.common.jdbc.exception.NestedSQLException:
---项目/ persistance / sql_xml / Article.xml中发生错误
---应用参数图时发生错误
---检查updateArticle-InlineParameterMap
---检查'crap'属性的参数映射
---原因:java.lang.NullPointerException
......关于我缺少什么的任何暗示? 感谢
===
......一路走到ClassCastExceptiong: - )
尝试设置这个原则:
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];
---项目/ persistance / sql_xml / Article.xml中发生错误
---应用参数图时发生错误
---检查updateArticle-InlineParameterMap
---检查'crap'属性的参数映射
---原因:java.lang.ClassCastException:java.util.ArrayList;嵌套异常是com.ibatis.common.jdbc.exception.NestedSQLException:
---项目/ persistance / sql_xml / Article.xml中发生错误
---应用参数图时发生错误
---检查updateArticle-InlineParameterMap
---检查'crap'属性的参数映射
---原因:java.lang.ClassCastException:java.util.ArrayList
......我今天已经拥有它了。 感谢
答案 0 :(得分:2)
答案 1 :(得分:1)
基于杰里米回答引用的页面,我不久前编写了自己的处理程序(有一些黑客)。万一你觉得它很有用:
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");
}
}
答案 2 :(得分:1)
......终于明白了。以下是它从一开始的情况:
...首先: reading the int[]
......第二:第二,搜索和绊倒时发现implementation of the java.sql.Array interface(仅限jdk 1.6)并在mailing list from 2005上发布。
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;
}
最后感谢所有人,并希望这会为别人节省一些时间: - )
PS:就像最后一个FYI一样,当我将问题发布到MyBatis邮件列表时,这就是我的回复:这有几个问题...
Arrays.asList()不适用于基本数组。见这里:
http://code.google.com/p/mybatis/source/detail?r=3467
我们在MyBatis 3中进行的更改是为了处理原始数组。
然后,您可能无法将java.util.List强制转换为java.sql.Array。 要创建java.sql.Array,您需要使用一些实用程序 您的JDBC驱动程序,或切换到JDK6并使用 Connection.createArrayOf(...)方法。
在JDBC中支持ARRAY类型是一个混乱,混合它 原始数组增加了另一层混乱:)