OceanBase データベースは、MySQL 公式 JDBC ドライバーによる接続をサポートしています。本記事では、MySQL Connector/J を使用して OceanBase データベースに接続し、操作する方法について説明します。
前提条件
- IntelliJ IDEAをダウンロードし、インストールしていること。
- JDK 1.8.0をダウンロードしていること。
- Mavenをダウンロードし、IntelliJ IDEAで設定していること。
- 本記事で使用されているプロジェクトのサンプルコードをダウンロードしていること。
バージョン互換性
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と指定します。
**コード:** ```java <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("...");テーブルを作成します。
コード:
// SQLステートメントを使用して、"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バージョンを使用する場合、アカウントのパスワードに # 文字を含めないでください。含めると接続に失敗する可能性があります。
詳細を見る
Javaサンプルアプリケーションの作成については、OceanBaseデータベースのオープンソースコミュニティにも関連する完全なサンプルがあります。詳細については、Javaサンプルアプリケーションを参照してください。
mysql-connector/j サンプルプロジェクトをダウンロード