Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

По сути, вам нужно создать вложенный тип таблицы в базе данных; построить объект 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')

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top