Використання Java масивів для вставки, отримання і зміни PostgreSQL масивів

Масиви є потужним засобом програмування, часто використовується розробниками, як в Java так і PL / PgSQL. Інтерфейси потенційно можуть стати складніше, наприклад, коли два з них намагаються і спілкуються один з одним. У цьому розділі розглядається, як можна написати простий код, який використовує java.sql.Array інтерфейс для вставки, вилучення, оновлення масивів в PostgreSQL.

Щоб продемонструвати цей функціонал, давайте створимо просту таблицю, яка зберігає назви країн в одній колонці у вигляді тексту, список яких-то міст, що належать цій країні у другій колонці у вигляді текстового масиву.

CREATE TABLE city_example (
country TEXT, 
cities TEXT[]
);

Тепер ми будемо використовувати інтерфейс JDBC для додавання, отримання і зміни даних в таблиці.

Вставка масивів
Кожен, хто знайомий з Java, використовував масиви в тому, чи іншому вигляді. Перед тим, як ці масиви будуть зберігатися в PostgreSQL, вони повинні бути перетворені в інтерфейс, наданий пакет java.sql package… Array.

JDBC-драйвер надає функції, які дозволяють приводити Java масиви до відповідних їм PostgreSQL масивів. Перетворення специфічно для кожної конкретної бази даних і визначено в PostgreSQL'ом org.postgresql.jdbc2.TypeInfoCache файлі. Крім того, важливо відзначити, що перетворення чутливе до регістру. Приміром, «INTEGER» — це не те ж саме, що «integer».

У цьому коді, функція createArrayOf Connection інтерфейсу використана для конвертації рядкових Java масивів в текстові PostgreSQL масиви перед вставкою.

try {

String[] usa = {"New York", "Чикаго", "San Francisco"};
String[] canada = {"Montreal", "Toronto", "Vancouver"};
String[] uk = {"London", "Birmingham", "Oxford"};

/*
Convert String[] to java.sql.Array using JDBC API
*/
Array arrayUSA = conn.createArrayOf("text", usa);
Array arrayCanada = conn.createArrayOf("text", canada);
Array arrayUK = conn.createArrayOf("text", uk);
String sql = "INSERT INTO city_example VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "USA");
pstmt.setArray(2, arrayUSA);
pstmt.executeUpdate();

pstmt.setString(1, "Canada");
pstmt.setArray(2, arrayCanada);
pstmt.executeUpdate();
pstmt.setString(1, "UK");
pstmt.setArray(2, arrayUK);
pstmt.executeUpdate();

conn.commit();
} catch (Exception e) {

System.out.println(e.getMessage());
e.printStackTrace();
}

Будь ласка, зверніть увагу, що тип даних, визначений у Connection.createArrayOf, повинен бути типом даних PostgreSQL, не java.sql.Types. Драйвер JDBC дивиться на тип даних в момент запуску для створення java.sql.Array об'єкта.

Цей код при виконанні, повертає такі дані в таблицю city_example:

select * from city_example ; 
country | cities 
---------+--------------------------------------
USA | {"New York",Chicago,"San Francisco"}
Canada | {Montreal,Toronto,Vancouver}
UK | {London,Birmingham,Oxford}
(3 rows)

Отримання масивів
Процес отримання масивів — це повністю зворотний процесу їх вставки процес. У нижченаведеному прикладі, перший крок — це отримання ResultSet з необхідними даними, а другий — перетворення PostgreSQL текстового масиву в рядковий масив Java.

try { 

String sql = "SELECT * FROM city_example";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();

while(rs.next()) {

System.out.println("Country: " + rs.getString(1));
System.out.println("---------------");

Array cities = rs.getArray(2);
String[] str_cities = (String[])cities.getArray();

for (int i=0; i<str_cities.length; i++) {
System.out.println(str_cities[i]);
}
System.out.println("");
}

} catch (Exception e) {

System.out.println(e.getMessage());
e.printStackTrace();
}

Для цього коду, висновок в stdout наступний:

Country: USA
---------------
New York
Chicago
San Francisco

Country: Canada
---------------
Montreal
Toronto
Vancouver

Country: UK
---------------
London
Birmingham
Oxford

Зміна масивів
Процес зміни масивів в PostgreSQL досить близький до процесу їх вставки. У цьому коді, новий набір міст США оголошено як Java рядковий масив, який потім перетворюється в PostgreSQL текстовий масив перед вставкою в існуючу рядок.

try {

String[] usa = {"New York", "Чикаго", "San Francisco", "Miami", "Київ"};
Array arrayUSA = conn.createArrayOf("text", usa);

String sql = "UPDATE city_example SET cities = ? Country WHERE = 'USA'";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setArray(1, arrayUSA);
pstmt.executeUpdate();

conn.commit();

} catch (Exception e) {

System.out.println(e.getMessage());
e.printStackTrace();
}

Після виконання цього коду, база виглядає наступним чином:

select * from city_example ;
country | cities 
---------+----------------------------------------------------
Canada | {Montreal,Toronto,Vancouver}
UK | {London,Birmingham,Oxford}
USA | {"New York",Chicago,"San Francisco",Miami,Seattle}
(3 rows)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.