Java配列を使用してPostgreSQL配列を挿入、取得、変更する

配列は、JavaとPL / PgSQLの両方で開発者がよく使用する強力なプログラミングツールです。 たとえば、2つのインターフェイスが互いに通信しようとすると、インターフェイスがより複雑になる可能性があります。 このセクションでは、java.sql.Arrayインターフェイスを使用してPostgreSQLで配列を挿入、抽出、更新する簡単なコードを記述する方法について説明します。

この機能を示すために、1列に国の名前をテキストとして保存し、2列目にこの国に属するいくつかの都市のリストをテキスト配列として保存する簡単なテーブルを作成しましょう。

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

次に、JDBCインターフェースを使用して、このテーブルのデータを追加、受信、変更します。

配列を挿入


Javaに精通した人は、何らかの形で配列を使用しています。 これらの配列をPostgreSQLに保存する前に、配列をjava.sqlパッケージ... Arrayパッケージで提供されるインターフェースに変換する必要があります。

JDBCドライバーは、Java配列を対応するPostgreSQL配列にキャストできる関数を提供します。 変換は特定の各データベースに固有であり、PostgreSQL org.postgresql.jdbc2.TypeInfoCacheファイルで定義されています。 さらに、変換では大文字と小文字が区別されることに注意することが重要です。 たとえば、「INTEGER」は「integer」と同じではありません。

次のコードでは、インターフェイスのcreateArrayOf Connection関数を使用して、挿入前に小文字のJava配列をPostgreSQLテキスト配列に変換しています。

 try { String[] usa = {"New York", "Chicago", "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で定義されているデータ型は、java.sql.Typesではなく、PostgreSQLデータ型でなければならないことに注意してください。 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を取得することであり、2番目は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", "Chicago", "San Francisco", "Miami", "Seattle"}; Array arrayUSA = conn.createArrayOf("text", usa); String sql = "UPDATE city_example SET cities = ? WHERE country = '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) 

Source: https://habr.com/ru/post/J301566/


All Articles