OceanBase Cloud データベースは、MySQL 公式 JDBC ドライバ経由の接続に対応しています。この文章では、MySQL Connector/J を使用して OceanBase Cloud データベースに接続し、使用する方法を説明します。
前提条件
- 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 -version- IntelliJ IDEA を開き、IntelliJ IDEA > Settings > Build,Execution,Development > Build Tools > Maven をクリックし、Maven home path に Maven インストールパッケージのパスを設定します。
操作手順
- OceanBase Cloud データベースの接続情報を取得します。
- ダウンロードしたプロジェクトのサンプルコードを変更します。
- プロジェクトのサンプルコードを実行します。
Java アプリケーションの作成
ステップ 1: データベース接続文字列の取得
OceanBase Cloudコンソール にログインします。インスタンスリストページで対象インスタンスの情報を展開し、対象テナントの下で 接続 > 接続文字列を取得 を選択します。
詳細な操作については、接続文字列の取得 をご参照ください。
作成済みの OceanBase Cloud データベースに基づいて、以下の URL の対応する情報を入力します。
obclient -h$host -P$port -u$user_name -p$password -D$database_nameパラメータの説明:
$host:OceanBase Cloud データベースの接続アドレスを指定します。例:t********.********.oceanbase.cloud。$port:OceanBase Cloud データベースの接続ポートを指定します。デフォルトは 3306 です。$database_name:アクセスするデータベース名です。注意
テナントに接続するアカウントは、該当データベースに対する
CREATE、INSERT、DROP、およびSELECT権限を持っている必要があります。アカウント権限の詳細については、アカウントの作成と管理 をご参照ください。$user_name:-uパラメータで指定する、データベースにアクセスするアカウントです。$password:アカウントのパスワードを指定します。
例は以下の通りです:
```shell
obclient -h t********.********.oceanbase.cloud -P3306 -u mysql001 -p****** -D test
```
ステップ 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://t********.********.oceanbase.cloud:3306/test?user=r***&password=******`host:
-hパラメータから取得する、OceanBase Cloud データベースの接続アドレスです。port:
-Pパラメータから取得する、OceanBase Cloud データベースの接続ポートです。dbname:
-Dパラメータから取得する、アクセスするデータベース名です。username:
-uパラメータから取得する、データベースにアクセスするアカウントです。password:
-pパラメータから取得する、アカウントのパスワードです。
変更後のコード例は以下の通りです:
//例 Connection connection = DriverManager.getConnection("jdbc:mysql://t********.********.oceanbase.cloud:3306/test?user=r***&password=******");注意
MySQL Connector/J 8.x を使用する場合、アカウントのパスワードに
#を含めないでください。含めると、サンプルプロジェクトの実行時にエラーが発生します。
MySQL Connector/J 5.1.47 ドライバを正しくインストールし、環境を設定した後、以下の Test.java ファイルのサンプルコードを使用してデータベースに接続し、使用できます。
<main id="notice" type='notice'>
<h4>注意</h4>
<p>MySQL Connector/J 8.x バージョンの場合、<code>Class.forName("com.mysql.jdbc.Driver")</code> の <code>com.mysql.jdbc.Driver</code> を <code>com.mysql.cj.jdbc.Driver</code> に置き換える必要があります。</p>
</main>
完全なコード例は以下の通りです:
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://t********.********.oceanbase.cloud:3306/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であることを宣言します。
コードは以下の通りです:
```java
<?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に指定します。
コードは以下の通りです:
```java
<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に指定します。
コードは以下の通りです:
```java
<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という名前のパブリッククラスを定義します。クラス名はファイル名と一致している必要があります。
- プログラムのエントリポイントとして、
プログラムの実行開始点として、パブリック静的メソッド
mainを定義します。- その他のデータベース操作です。
コードは以下の通りです:
```java
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://t********.********.oceanbase.cloud:3306/test?user=们ysql001&password=********");
**パラメータの説明:**
* `$host`:OceanBase Cloud データベースの接続アドレスを指定します。例:`t********.********.oceanbase.cloud`。
* `$port`:OceanBase Cloud データベースの接続ポートを指定します。デフォルトは 3306 です。
* `$database_name`:アクセスするデータベース名が必要です。
* `$user_name`:データベースにアクセスするアカウントを指定します。
* `$password`:アカウントのパスワードを指定します。
- SQL ステートメントを作成して実行します。
Statement stmt = connection.createStatement();
stmt.execute("...");
- テーブルを作成します。
コードは以下の通りです:
```java
// 用 SQL 语句删除如果存在名为 "test" 的表 stmt.execute("drop table if exists test"); // 创建一个新的名为 "test" 的表,包含两个字段:整型的 "id" 和字符型的 "name" stmt.execute("create table test (id int, name varchar(25))"); // 打印创建表成功的消息 System.out.println("create table successfully"); ```
- データを挿入します。
コードは以下の通りです:
```java
// 在 "test" 表中插入两行数据 stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')"); // 打印插入数据成功的消息 System.out.println("insert data successfully"); ```
- データをクエリします。
コードは以下の通りです:
```java
// 打印查询数据的消息 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")); ```
- データを更新します。
コードは以下の通りです:
```java
// 更新 "test" 表中 id 为 1 的记录的 "name" 字段为 'bbb' stmt.execute("update test set name = 'bbb' where id = 1"); // 打印更新数据成功的消息 System.out.println("update data successfully"); ```
- データを削除します。
コードは以下の通りです:
```java
// 删除 "test" 表 stmt.execute("drop table test"); // 关闭结果集、语句和数据库连接 rs.close(); stmt.close(); connection.close(); ```
例外処理。
上記のデータベース操作の実行中に例外が発生した場合、それらの例外はキャッチされ、エラーメッセージとスタックトレースの詳細が出力されます。
コードは以下の通りです:
} catch (Exception e) {
System.out.println("error!");
e.printStackTrace();
}
完全なコードの表示
```java
<?xml version="1.0" encoding="UTF-8"?>
<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>
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");
<main id="notice" type='notice'>
<h4>注意</h4>
<p>MySQL Connector/J 8.x バージョンを使用する場合、アカウントのパスワードに <code>#</code> 文字を含めないでください。含めると、接続に失敗する可能性があります。</p>
</main>
詳細情報
Java サンプルアプリケーションの作成については、OceanBase Cloud データベースのオープンソースコミュニティにも関連する完全なサンプルがあります。詳細については、Javaサンプルアプリケーション をご参照ください。