OceanBaseデータベースは、MySQL公式JDBCドライバーを使用した接続に対応しています。本記事では、MySQL Connector/Jを使用してOceanBaseデータベースに接続し、使用する方法について説明します。
前提条件
- IntelliJ IDEA をダウンロードしてインストール済みであること。
- JDK 1.8.0がダウンロード済みであること。
- IntelliJ IDEAをダウンロードして Maven を設定済みであること。
- 本記事で使用しているサンプルコードをダウンロード済みであること。
バージョン互換性
| MySQL Connector/Jバージョン | 推奨バージョン | 説明 |
|---|---|---|
| 5.x | 5.1.40 ~ 5.1.49 | 安定版 |
| 8.x | 8.0.7 ~ 8.0.25, 8.2.0 ~ 8.4.0 | 新機能サポート |
機能特性
- 標準のJDBC APIをサポート
- 接続プール管理を提供
- SSL接続をサポート
- バッチ操作をサポート
- プリペアドステートメントをサポート
インストール後の確認
JDKが正常にインストールされたかどうか確認します:
java -versionMavenが正しくインストールされているかどうか確認します:
mvn -version(オプション)IntelliJ IDEAのMavenの設定が正しいかどうか確認します:
本記事は、参考用の簡単なサンプルプロジェクトを提供しています。より複雑なサンプルの開発を試したい場合は、開発環境に適したバージョンのMavenをダウンロードし、以下の手順に従ってIntelliJ IDEAに設定することができます。
Mavenが正しくインストールされているかどうか確認します:
mvn -versionIntelliJ IDEAを開き、IntelliJ IDEA > Settings > Build,Execution,Development > Build Tools > Maven をクリックし、Maven Home path に Maven インストールパッケージのパスを設定します。

操作手順
- OceanBaseデータベースの接続情報を取得します。
- ダウンロードしたプロジェクトサンプルコードを修正します。
- プロジェクトサンプルコードを実行します。
Javaアプリケーションの作成
ステップ1:データベース接続文字列を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。例:
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名。注意
テナントに接続するユーザーは、データベースに対する
CREATE、INSERT、DROP、およびSELECT権限が付与されていなければなりません。その他のユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
その他の接続文字列に関する詳細は、OBClientを使用したOceanBaseテナントへの接続を参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ2:プロジェクトサンプルコードを修正する
ダウンロードしたプロジェクトサンプルを解凍します。
IntelliJ IDEA を開き、File > Open をクリックして、プロジェクトのサンプルファイルを追加します。
ステップ1で取得した接続文字列の情報に基づいて、プロジェクトコード JDBCDemo > src > main > java > JDBCTest ファイル内の以下のデータベース接続パラメータを修正します。
コード内のデータベース接続パラメータを修正します。以下のフィールドと連結方法を参照し、対応する値を、ステップ1で取得したデータベース接続文字列から取得します。
connection = DriverManager.getConnection("jdbc:mysql://{host}:{port}/{dbname}?user={username}&password={******}") //例 jdbc:mysql://100.88.xx.xx:2881/test?user=r***&password=******`host:
-hパラメータから取得したOceanBaseデータベースの接続アドレスで、ODPアドレスの場合もあります。port:
-Pパラメータから取得したOceanBaseデータベースの接続ポートで、ODPのリスニングポートでもあります。dbname:
-Dパラメータから取得した、アクセスが必要なデータベースの名前です。username:
-uパラメータから取得したテナントの接続ユーザー名は、ユーザー@テナント#クラスタ名 の形式です。クラスタのデフォルトテナントは 'sys'、テナントのデフォルト管理者ユーザーは 'root' です。データベースに直接接続する場合、クラスタ名は不要です。ODPを介して接続する場合は、クラスタ名を入力する必要があります。password:
-pパラメータから取得したユーザーパスワードです。
修正後のコードスニペットの例:
//例 Connection connection = DriverManager.getConnection("jdbc:mysql://100.88.xx.xx:2881/test?user=r***&password=******");注意
MySQL Connector/J 8.xを使用する場合は、アカウントパスワードに
#を使用しないでください。使用した場合、サンプルプロジェクトを実行する際にエラーが発生します。
MySQL Connector/J 5.1.47ドライバーを正しくインストールし、環境を設定した後、以下の Test.java ファイルのサンプルコードを使用してデータベースに接続し、使用することができます。
注意
MySQL Connector/J 8.xを使用する場合、Class.forName("com.mysql.jdbc.Driver") の com.mysql.jdbc.Driver を com.mysql.cj.jdbc.Driver に置き換える必要があります。
完全なコードの例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) {
try {
//load driver
Class.forName("com.mysql.jdbc.Driver"); //mysql-jdbc 5
// Class.forName("com.mysql.cj.jdbc.Driver"); //mysql-jdbc 8
//create connection
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:2881/test?user=r***&password=");
System.out.println("jdbc version : " + connection.getMetaData().getDriverVersion());
Statement stmt = connection.createStatement();
//create table
stmt.execute("drop table if exists test");
stmt.execute("create table test (id int, name varchar(25))");
System.out.println("create table successfully");
//insert data
stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')");
System.out.println("insert data successfully");
//query data
System.out.println("query data : ");
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
//update data
stmt.execute("update test set name = 'bbb' where id = 1");
System.out.println("update data successfully");
//query data after update
System.out.println("query data after update : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
//delete data
stmt.execute("delete from test where id = 1");
System.out.println("delete data successfully");
//query data after delete
System.out.println("query data after delete : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
//drop table
stmt.execute("drop table test");
//close
rs.close();
stmt.close();
connection.close();
} catch (Exception e) {
System.out.println("error!");
e.printStackTrace();
}
}
}
ステップ3:アプリケーションを実行する
IntelliJ IDEAでサンプルプロジェクトを実行します。以下の結果が返された場合、データベースへの接続に成功し、サンプルプロジェクトが正しく実行されたことを示します。
プロジェクトコードについて
mysql-connector/j をクリックしてプロジェクトコードをダウンロードします。これは JDBCDemo.zip という名前の圧縮ファイルです。
解凍すると、JDBCDemoという名前のディレクトリが作成されます。ディレクトリ構造は以下のとおりです:
JDBCDemo
├── src
│ └── main
│ └── java
│ └── JDBCTest.java
└── pom.xml
ファイルの説明:
src:ソースコードのルートディレクトリです。main:アプリケーションの主要なロジックを含むメインコードディレクトリです。java:Javaソースコードディレクトリです。JDBCTest.java:メインクラス。テーブルの作成やデータの挿入などのロジックを含みます。pom.xml:プロジェクトの依存関係とビルド設定を管理するために使用されるMavenプロジェクトの設定ファイルです。
pom.xmlコードの紹介
pom.xml ファイルはMavenプロジェクトの設定ファイルで、プロジェクトの依存関係、プラグイン、ビルドルールなどの情報を定義しています。MavenはJavaプロジェクト管理ツールで、依存関係のダウンロード、プロジェクトのコンパイル、パッケージングなどの操作を自動化できます。
本記事の pom.xml ファイルのコードは、主に以下のいくつかの部分が含まれます:
ファイル宣言ステートメントです。
このファイルがXMLファイルであり、使用しているXMLのバージョンが
1.0で、文字エンコーディング方式がUTF-8であることを宣言しています。コード:
<?xml version="1.0" encoding="UTF-8"?>POMのネームスペースとPOMモデルのバージョンを設定します。
xmlnsを使用して、POMのネームスペースをhttp://maven.apache.org/POM/4.0.0と指定します。xmlns:xsiを使用して、XMLネームスペースをhttp://www.w3.org/2001/XMLSchema-instanceと指定します。xsi:schemaLocationを使用して、POMのネームスペースをhttp://maven.apache.org/POM/4.0.0、POMのXSDファイルの場所をhttp://maven.apache.org/xsd/maven-4.0.0.xsdと指定します。<modelVersion>要素を使用して、このPOMファイルで使用されるPOMモデルバージョンを4.0.0と指定します。
コード:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- その他の設定 --> </project>基本情報を設定します。
<groupId>を使用して、プロジェクトが属する組織をcom.exampleと指定します。<artifactId>を使用して、プロジェクトの名前をJDBCDemoと指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTと指定します。
コード:
<groupId>org.example</groupId> <artifactId>JDBCDemo</artifactId> <version>1.0-SNAPSHOT</version>プロジェクトが依存するコンポーネントを設定します。
データベースとのインタラクションを実行するために、
mysql-connector-java依存ライブラリを追加します:説明
このセクションのコードは、プロジェクトが依存するコンポーネントがMySQL Connector/JのV5.1.40バージョンであることを定義しています。他のバージョンの情報については、MySQL Connector/Jを参照してください。
<groupId>を使用して、依存関係が属する組織をmysqlと指定します。<artifactId>を使用して、依存関係の名前をmysql-connector-javaと指定します。<version>を使用して、依存関係のバージョン番号を5.1.40と指定します。
コード:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>
JDBCTest.javaコードの紹介
JDBCTest.java ファイルはサンプルプログラムの一部で、コードはMySQL Connector/Jを使用してデータベース操作を実行する方法を示しています。まずデータベース接続情報を設定してから、JDBCTest オブジェクトを作成しデータベース操作を実行します。コードには、テーブルの作成、データの挿入、データのクエリを実行するサンプルも含まれます。
本記事の JDBCTest.java ファイルのコードは、主に以下のもので構成されています:
JavaプログラムでJDBC APIを使用するために必要なJavaクラスをインポートします。
- Connectionはデータベースとの接続を確立するために使用されます。
- DriverManagerはJDBCドライバーを管理します。
- ResultSetは、SQLクエリによって返されたデータを処理するために使用されます。
- Statementは、静的SQLステートメントを実行し、結果を返すために使用されます。
コード:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;JDBCTestクラスを作成し、mainメソッドを定義します。JDBCTestという名前のpublicクラスを定義し、プログラムのエントリポイントとします。クラス名はファイル名と一致させる必要があります。- プログラムの実行開始点として、public staticメソッド
mainを定義します。 - その他のデータベース操作。
コード:
public class Main { public static void main(String[] args) { // データベース接続情報 // データソースの作成 // テーブルの作成 // データの挿入 // データの更新 // データの削除 } }データベース接続情報を定義します。
Class.forName()を使用してMySQL JDBCドライバーをロードおよび登録します。DriverManager.getConnection()メソッドは、データベースに接続するためのURL、ユーザー名、およびパスワードを定義します。$host、$port、$database_name、$user_nameおよび$passwordを実際のデータベース接続情報に置き換える必要があります。
コード:
Class.forName("com.mysql.jdbc.Driver"); //mysql-jdbc 5 //Class.forName("com.mysql.cj.jdbc.Driver"); //mysql-jdbc 8 Connection connection = DriverManager.getConnection("jdbc:mysql://xx.xxx.xxx.xxx:2881/test?user=test@tt1&password=test");パラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
SQLステートメントを作成し、実行します。
Statement stmt = connection.createStatement(); stmt.execute("...");テーブルを作成します。
コード:
// "test" という名前のテーブルが存在する場合は削除する stmt.execute("drop table if exists test"); // "test" という名前の新しいテーブルを作成する。フィールドは、整数型の "id" と文字型の "name" の2つ stmt.execute("create table test (id int, name varchar(25))"); // テーブルの作成に成功したメッセージを出力する System.out.println("create table successfully");データを挿入します。
コード:
// "test" テーブルに2行のデータを挿入する stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')"); // データの挿入に成功したメッセージを出力する System.out.println("insert data successfully");データをクエリします。
コード:
// データのクエリのメッセージを出力する System.out.println("query data : "); // クエリSQLステートメントを実行し、"test" テーブルのすべてのデータを取得する ResultSet rs = stmt.executeQuery("select * from test"); // 結果セットをイテレーションする while (rs.next()) { // 各データの "id" と "name" フィールドを出力する System.out.println(rs.getString("id") + "\t" + rs.getString("name"));データを更新します。
コード:
// "test" テーブルのidが1のレコードの "name" フィールドを 'bbb' に更新する stmt.execute("update test set name = 'bbb' where id = 1"); // データの更新に成功したメッセージを出力する System.out.println("update data successfully");データを削除します。
コード:
// "test" テーブルを削除する stmt.execute("drop table test"); // 結果セット、ステートメント、およびデータベース接続を閉じる rs.close(); stmt.close(); connection.close();例外処理を行います。
上記のデータベース操作を実行する過程で例外が発生した場合、これらの例外はキャプチャされ、エラーメッセージとスタックトレースの詳細が出力されます。
コード:
} catch (Exception e) { System.out.println("error!"); e.printStackTrace(); }
全コード表示
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>JDBCDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.mysql</groupId>-->
<!-- <artifactId>mysql-connector-j</artifactId>-->
<!-- <version>8.0.33</version>-->
<!-- </dependency>-->
</dependencies>
</project>
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) {
try {
//load driver
Class.forName("com.mysql.jdbc.Driver"); //mysql-jdbc 5
// Class.forName("com.mysql.cj.jdbc.Driver"); //mysql-jdbc 8
//create connection
Connection connection = DriverManager.getConnection("jdbc:mysql://{host}:{port}/{dbname}?user={username}&password={******}");
System.out.println("jdbc version : " + connection.getMetaData().getDriverVersion());
Statement stmt = connection.createStatement();
//create table
stmt.execute("drop table if exists test");
stmt.execute("create table test (id int, name varchar(25))");
System.out.println("create table successfully");
//insert data
stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')");
System.out.println("insert data successfully");
//query data
System.out.println("query data : ");
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
//update data
stmt.execute("update test set name = 'bbb' where id = 1");
System.out.println("update data successfully");
//query data after update
System.out.println("query data after update : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
//delete data
stmt.execute("delete from test where id = 1");
System.out.println("delete data successfully");
//query data after delete
System.out.println("query data after delete : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
//drop table
stmt.execute("drop table test");
//close
rs.close();
stmt.close();
connection.close();
} catch (Exception e) {
System.out.println("error!");
e.printStackTrace();
}
}
}
ベストプラクティス
バッチ操作
バッチ処理を使用してパフォーマンスを向上:
PreparedStatement pstmt = connection.prepareStatement("INSERT INTO test VALUES (?, ?)");
for (int i = 0; i < 1000; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "name" + i);
pstmt.addBatch();
}
pstmt.executeBatch();
プリペアドステートメント
プリペアドステートメントを使用してSQLインジェクションを防止:
PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM test WHERE id = ?");
pstmt.setInt(1, 1);
ResultSet rs = pstmt.executeQuery();
よくある質問
1. 接続タイムアウト
接続タイムアウトパラメータの設定:
jdbc:mysql://host:port/database?connectTimeout=30000&socketTimeout=60000
2. 文字セットの問題
正しい文字セットを設定する:
jdbc:mysql://host:port/database?characterEncoding=utf8&useUnicode=true
3. SSL接続
SSL接続を有効化:
jdbc:mysql://host:port/database?useSSL=true&requireSSL=true
4. アカウントパスワードに含まれる特殊文字
アカウントのパスワードに特殊文字(例えば #)が含まれている場合は、URLエンコーディングを行う必要があります:
String encodedPassword = URLEncoder.encode(password, "UTF-8");
注意
MySQL Connector/J 8.xバージョンを使用する際は、アカウントのパスワードに # 文字を含めないようにしてください。そうしないと、接続に失敗する可能性があります。
詳細情報
OceanBaseデータベースのオープンソースコミュニティには、Javaサンプルアプリケーションを作成するための関連する完全なサンプルもあります。詳細については、Javaサンプルアプリケーションを参照してください。
クリックしてmysql-connector/jサンプルプロジェクトをダウンロードします