本トピックでは、POLARDB Java Database Connectivity (JDBC) ドライバーを使用して、Java アプリケーションを ApsaraDB for POLARDB データベースに接続する方法について説明します。

始める前に

  • ApsaraDB for POLARDB クラスターのアカウントが作成されている必要があります。 アカウントの作成方法の詳細については、「データベースアカウントの作成」をご参照ください。
  • ApsaraDB for POLARDB クラスターに接続するホストの IP アドレスをホワイトリストに追加されている必要があります。 詳細については、「POLARDB クラスターのホワイトリストの設定」をご参照ください。

このタスクについて

JDBC は、プログラミング言語 Java のアプリケーションプログラミングインターフェイスであり、クライアントがデータベースにアクセスする方法を定義します。 ApsaraDB for POLARDB は、オープンソースの PostgreSQL JDBC ドライバーに基づいた Oracle JDBC ドライバーを提供します。 Oracle JDBC ドライバーは、LAN 通信に PostgreSQL プロトコルを使用し、Java アプリケーションが標準的かつデータベースに依存しない Java コードを使用してデータベースに接続できるようにします。

POLARDB JDBC ドライバーは、PostgreSQL 3.0 プロトコルを使用し、Java 6 (JDBC 4.0)、Java 7 (JDBC 4.1)、および Java 8 (JDBC 4.2) と互換性があります。

POLARDB JDBC ドライバーのダウンロード

POLARDB JDBC ドライバーをダウンロードします。 Alibaba Cloud は、Java 6、Java 7、および Java 8 と互換性のある 3 つの JDBC バージョンを提供します。 3 つの JAR パッケージの名前は、それぞれ polardb-jdbc16.jarpolardb-jdbc17.jar、および polardb-jdbc18.jar です。 アプリケーションで使用される JDK のバージョンに基づいて、適切な JDBC バージョンを選択できます。

POLARDB JDBC ドライバーの設定

Java アプリケーションで POLARDB JDBC ドライバーを使用する前に、JDBC ドライバーパッケージのパスを CLASSPATH に追加する必要があります。 たとえば、JDBC ドライバーのパスが /usr/local/polardb/share/java/ である場合、次のコマンドを実行して JDBC ドライバーのパスを CLASSPATH に追加します。

export CLASSPATH=$CLASSPATH:/usr/local/polardb/share/java/<Name of the JAR package.jar>

例:

export CLASSPATH=$CLASSPATH:/usr/local/polardb/share/java/polardb-jdbc18.jar

次のコマンドを実行して、現在の JDBC のバージョンを表示します。

#java -jar <Name of the JAR package.jar>

例:

#java -jar polardb-jdbc18.jar
POLARDB JDBC Driver 42.2.5.2.0

Maven を使用した Java プロジェクトのセットアップ

Maven を使用して Java プロジェクトをビルドしている場合は、次のコマンドを実行して、JDBC ドライバーパッケージをローカルリポジトリにインストールします。

 mvn install:install-file -DgroupId=com.aliyun -DartifactId=<Name of the JAR package> -Dversion=1.1.2 -Dpackaging=jar -Dfile=/usr/local/polardb/share/java/<Name of the JAR package.jar>

例:

 mvn install:install-file -DgroupId=com.aliyun -DartifactId=polardb-jdbc18 -Dversion=1.1.2 -Dpackaging=jar -Dfile=/usr/local/polardb/share/java/polardb-jdbc18.jar

次の依存関係を Maven プロジェクトの pom.xml ファイルに追加します。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>parent</artifactId>
    <version>1.1.2</version>
</dependency>

例:

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>odps-jdbc</artifactId>
    <version>1.1.2</version>
</dependency>

Hibernate アプリケーションのプロジェクトの設定

プロジェクトが Hibernate を使用してデータベースに接続している場合は、Hibernate 設定ファイル hibernate.cfg.xml を開き、ApsaraDB for POLARDB データベースのドライバークラスと方言を設定します。

Hibernate バージョン 3.6 以降のみが PostgresPlusDialect をサポートしています。
<property name="connection.driver_class">com.aliyun.polardb.Driver</property>
<property name="connection.url">jdbc:polardb://pc-***.o.polardb.rds.aliyuncs.com:1521/polardb_test</property>
<property name="dialect">org.hibernate.dialect.PostgresPlusDialect</property>

POLARDB JDBC ドライバーのロード

Class.forName("com.aliyun.polardb.Driver");

package com.aliyun.polardb;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * POLARDB JDBC DEMO
 * <p>
 * Please make sure the host ip running this demo is in you cluster's white list.
 */
public class PolarDBJdbcDemo {
  /**
   * Replace the following information.
   */
  private final String host = "***.o.polardb.rds.aliyuncs.com";
  private final String user = "***";
  private final String password = "***";
  private final String port = "1921";
  private final String database = "db_name";

  public void run() throws Exception {
    Connection connect = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
      Class.forName("com.aliyun.polardb.Driver");

      Properties props = new Properties();
      props.put("user", user);
      props.put("password", password);
      String url = "jdbc:polardb://" + host + ":" + port + "/" + database;
      connect = DriverManager.getConnection(url, props);

      /**
       * create table foo(id int, name varchar(20));
       */
      String sql = "select id, name from foo";
      statement = connect.createStatement();
      resultSet = statement.executeQuery(sql);
      while (resultSet.next()) {
        System.out.println("id:" + resultSet.getInt(1));
        System.out.println("name:" + resultSet.getString(2));
      }
    } catch (Exception e) {
      e.printStackTrace();
      throw e;
    } finally {
      try {
        if (resultSet ! = null)
          resultSet.close();
        if (statement ! = null)
          statement.close();
        if (connect ! = null)
          connect.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw e;
      }
    }
  }

  public static void main(String[] args) throws Exception {
    PolarDBJdbcDemo demo = new PolarDBJdbcDemo();
    demo.run();
  }
}

JDBC では、データベースは通常、次のような URL で表されます。

jdbc:polardb://pc-***.o.polardb.rds.aliyuncs.com:1521/polardb_test? user=test&password=Pw123456
パラメーター 説明
URL prefix jdbc:polardb:// URL のプレフィックスを jdbc:polardb:// に設定します。
Endpoint pc-***.o.polardb.rds.aliyuncs.com ApsaraDB for POLARDB クラスターのエンドポイント。 エンドポイントの照会方法の詳細については、「エンドポイントの表示」をご参照ください。
Port 1521 ApsaraDB for POLARDB クラスターのポート。 デフォルト値:1521
Database polardb_test 接続するデータベースの名前。
Username test ApsaraDB for POLARDB クラスターに接続するためのユーザー名。
Password Pw123456 ユーザー名のパスワード。

データベースでクエリを実行するときは、StatementPreparedStatment、または CallableStatement オブジェクトを作成する必要があります。

前の例では、Statement オブジェクトが作成されます。 次のサンプルコードは、PreparedStatment オブジェクトを作成します。

PreparedStatement st = conn.prepareStatement("select id, name from foo where id > ?") ;
st.setInt(1, 10);
resultSet = st.executeQuery();
while (resultSet.next()) {
    System.out.println("id:" + resultSet.getInt(1));
    System.out.println("name:" + resultSet.getString(2));
}

次の例に示すように、CallableStatement はストアドプロシージャの処理に使用されます。

String sql = "{? =call getName (?, ?, ?)}" ;
CallableStatement stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, java.sql.Types.INTEGER);

//Bind IN parameter first, then bind OUT parameter
int id = 100;
stmt.setInt(2, id); // This would set ID as 102
stmt.registerOutParameter(3, java.sql.Types.VARCHAR);
stmt.registerOutParameter(4, java.sql.Types.INTEGER);

//Use execute method to run stored procedure.
stmt.execute();

//Retrieve name with getXXX method
String name = stmt.getString(3);
Integer msgId = stmt.getInt(4);
Integer result = stmt.getInt(1);
System.out.println("Name with ID:" + id + " is " + name + ", and messegeID is " + msgId + ", and return is " + result);

次のコードは、上記のコードで使用されるストアドプロシージャ getName を作成する方法を示しています。

CREATE OR REPLACE FUNCTION getName(
    id        In      Integer,
    name      Out     Varchar2,
    result    Out     Integer
  ) Return Integer
Is
  ret     Int;
Begin
  ret := 0;
  name := 'Test';
  result := 1;
  Return(ret);
End;