JDBCを使ってPostgreSQLにアクセス

2015-07-05 - tomoTakaの日記で作成したテーブル「Address」をJDBCを使ってSELECTしてみました。
JavaのプロジェクトはNetBeansを使ってMavenプロジェクトとして作成。

  • pom.xml(以下のJDBCを追加)
        <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>9.4-1201-jdbc41</version>
        </dependency>
  • とりあえずGeometry型のPOINTを取得
    private void test1() {
        try (Connection conn = DriverManager.getConnection("jdbc:postgresql:tomo", "tomo", "");) {
            String sql = "select POINT(geo_point) from address limit ?;";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setInt(1, 1);
            System.out.println(String.format("*** SQL:%s ***", stmt.toString()));
            try (ResultSet rs = stmt.executeQuery();) {
                while (rs.next()) {
                    String val1 = rs.getString(1);
                    System.out.println(String.format("POINT:%s", val1));
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  • 実行結果(POINTの値、経度、緯度が取得できました)

  • Customized Typeを使っての実装

参考にしたのはここUsing Customized Type Mappings (The Java™ Tutorials > JDBC(TM) Database Access > JDBC Basics)です
以下の実装では、conn.getTypeMap()の結果がnullになっていました。(汗)、、、

    private void test2() {
        try (Connection conn = DriverManager.getConnection("jdbc:postgresql:tomo", "tomo", "");) {
            System.out.println(conn);
            Map<String, Class<?>> map = conn.getTypeMap();
            System.out.println("***map:" + map); // <---ここでmapがnullになっていることを確認
            map.put("GeoPoint", Class.forName("com.mycompany.postgre.sample.GeoPoint"));
            String sql = "select POINT(geo_point) from address limit ?;";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setInt(1, 1);
            System.out.println(String.format("*** SQL:%s ***", stmt.toString()));
            try (ResultSet rs = stmt.executeQuery();) {
                while (rs.next()) {
                    GeoPoint object = (GeoPoint) rs.getObject("GeoPoint");
                    System.out.println(String.format("lat:", object.lat));
                    System.out.println(String.format("lng:", object.lng));
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

実行結果

とりあえずここまでをアップしました。tomoTaka01/postgre-sample - Java - GitHub
PostgreSQlでは、ほかの方法があるようです、、、
ここPostgreSQL: Documentation: 7.1: PostgreSQL Extensions to the JDBC APIを参考にまた挑戦します!