Как связать ArrayList с PreparedStatement в Oracle? - PullRequest
5 голосов
/ 19 ноября 2008

Мне было интересно, есть ли способ связать ArrayList (или любой другой список, в этом отношении) с PreparedStatement, который в конечном итоге будет использоваться для доступа к базе данных Oracle. Я нашел:

Альтернативные предложения PreparedStatement IN?

И это похоже на мою проблему, но этот вопрос более конкретен: я хотел бы связать ArrayList с PreparedStatement, который будет использоваться в Oracle, если это возможно, как это сделать?

Ответы [ 3 ]

5 голосов
/ 19 ноября 2008

Нельзя связать List с одним параметром в подготовленном выражении.

Генерация SQL с маркером параметра для каждого элемента в списке, например:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)

Даже если вы создадите новую инструкцию для каждого запроса, я все равно рекомендую использовать PreparedStatement. Если ваш список содержит String экземпляров, вы получите необходимый выход для защиты от внедрения SQL.

Но даже если это безопасный тип, такой как Integer объекты, некоторые драйверы или промежуточное ПО могут кэшировать PreparedStatements и возвращать кэшированный экземпляр, если запрашивается та же форма. Конечно, некоторые испытания будут необходимы. Если ваши списки сильно различаются по размеру, у вас будет много разных операторов, и плохо реализованный кэш может быть не готов к обработке такого количества.

3 голосов
/ 19 ноября 2008

Вы не можете связать это напрямую. Есть способ передать массив в качестве параметра. Я понятия не имею, что вы хотите сделать с ним на стороне базы данных, поэтому это может вам не помочь.

По сути, вы должны создать вложенный тип таблицы в базе данных; построить объект Java на основе этого типа, содержащий данные из вашего массива; и передать это в качестве параметра.

Если вы создали эти объекты в базе данных:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20);
CREATE TABLE my_table (a  my_nested_table) NESTED TABLE a STORE AS my_table_a;

Тогда вы можете написать код Java следующим образом:

String[] insertvalues = { "a", "b", "c" };
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES( ? )");
ARRAY insertParameter = new ARRAY( a_desc, conn, insertvalues );
p.setArray( 1, insertParameter );
p.execute();

Результаты в Oracle выглядят так:

dev> select * from my_table;

A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')
0 голосов
/ 19 ноября 2008

Ну, судя по ответу на этот вопрос, особенно по комментариям к моему неправильному ответу на этот вопрос, вы не можете.

См. http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857

...