Как вы записываете массивы в базу данных Oracle 10g XE с помощью iBatis? - PullRequest
0 голосов
/ 25 апреля 2011

Я искал ответ на этот максимум и минимум, но не могу получить ответ.

По сути, у меня есть объект, который я пишу в свою базу данных с помощью iBatis. Это прекрасно работает с примитивными типами, такими как строки, int и т. Д., Но один из атрибутов моего объекта - это массив других объектов. Я хотел бы иметь возможность сохранить это, а затем вызвать оператор 'selectById' и получить полный объект, включая массив.

Вот код, который у меня есть:

Mapper.xml

  <insert id="insertTrade" parameterClass="TradeObject">
insert into TESTTABLE (
  ORDERID,
  MAXPX,
  COMMISSION,
  ACCOUNTGRP )
values (
  #orderID#, #maxPx#, #commission#, #accountGrp#
)

accountGrp - мой массив, но в данный момент он выдает ошибку. Оператор прекрасно работает без этого поля.

Ява выглядит так:

  public static void insertTrade (Trade obj) throws SQLException {
  logger.debug("inserting trade. Order Id: " + obj.toString());
sqlMapper.insert("insertTrade", obj);

}

Спасибо за любую помощь заранее!

1 Ответ

2 голосов
/ 11 июня 2011

Я сделал с Mybatis3, должно быть похоже на старые вещи iBatis. Чтобы получить материал JDBC, прочитайте эту ветку . Это огромная нить, но она есть. Ищите «ArrayDescriptor».

По сути, вам нужно написать TypeHandler. В TypeHandler вызовите setArray. Должно быть что-то подобное в mybatis 3.x. Ваша работа со списком, просто конвертировать с помощью метода toArray. Это пример, где параметром является строка [].

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 обязательно укажите обработчик типа.

...