我已经找到了这个高低的答案,但无法得到答案。
基本上我有一个使用iBatis写入数据库的对象。这适用于原始类型,如字符串,int等,但我的对象的一个属性是其他对象的数组。我希望能够持久保存,然后调用'selectById'语句并检索包括数组在内的完整对象。
这是我到目前为止的代码:
Mapper.xml
<insert id="insertTrade" parameterClass="TradeObject">
insert into TESTTABLE (
ORDERID,
MAXPX,
COMMISSION,
ACCOUNTGRP )
values (
#orderID#, #maxPx#, #commission#, #accountGrp#
)
accountGrp是我的数组,但它目前正在抛出一个错误。如果没有这个字段,该声明可以正常工作。
java就像这样:
public static void insertTrade (Trade obj) throws SQLException {
logger.debug("inserting trade. Order Id: " + obj.toString());
sqlMapper.insert("insertTrade", obj);
}
感谢您提前提供任何帮助!!
答案 0 :(得分:2)
我已经完成了Mybatis3,应该与旧的iBatis相似。要获取JDBC内容,请阅读this thread。这是一个巨大的线索,但它就在那里。寻找“ArrayDescriptor”。
基本上,你需要编写一个TypeHandler。在TypeHandler中,调用setArray。在mybatis 3.x中应该是这样的。您使用List,只需使用toArray方法进行转换。这是一个示例,其中参数是String []。
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
.....
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException
{
//null check?
ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRARRAY ", ps.getConnection());
ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), parameter);
ps.setArray(i, oracleArray);
}
在ibatis中也许是这样的,
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException
{
ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRARRAY", setter.getPreparedStatement().getConnection());
ARRAY oracleArray = new ARRAY(desc, setter.getPreparedStatement().getConnection(), parameter);
setter.setArray(oracleArray);
}
让你构建一个类型,就像在那个帖子中所说的那样。
即
CREATE OR REPLACE TYPE STRARRAY AS TABLE OF VARCHAR2 (255)
然后在SQL映射中,确保引用类型处理程序。