本書では、Spring JDBCフレームワーク、MySQL Connector/J、およびOceanBase Cloudクラウドデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、クエリなどの基本的なデータベース操作を実装する方法について説明します。
機能特性
- 基本的なCRUD操作に対応
- トランザクション管理の提供
- 例外処理メカニズム
- 接続プール管理
適用シナリオ
- SQL文を直接使用する必要があるシナリオ
- 高いパフォーマンスが要求されるシナリオ
- シンプルなデータベース操作のシナリオ
前提条件
-
OceanBase Cloudクラウドデータベースのアカウントを登録し、クラスタインスタンスとMySQL互換モードのテナントを作成していること。詳細は、クラスタインスタンスの作成およびテナントの作成をご参照ください。
JDK 1.8およびMavenをインストールしていること。
Eclipseをインストールしていること。
説明
本書でコードを実行するために使用しているツールはEclipse IDE for Java Developers 2022-03バージョンですが、好みに応じて適切なツールを選択してサンプルコードを実行することもできます。
操作手順
<main id="notice" type='explain'>
<h4>説明</h4>
<p>本書に記載されている手順は、Windows環境でEclipse IDE for Java Developers 2022-03を使用してプロジェクトをコンパイルおよび実行する手順です。他のオペレーティングシステム環境やコンパイラを使用する場合、手順が若干異なる場合があります。</p>
</main>
spring-jdbc-mysql-clientプロジェクトをEclipseにインポートします。- OceanBase CloudクラウドデータベースのURLを取得します。
spring-jdbc-mysql-clientプロジェクト内のデータベース接続情報を変更します。spring-jdbc-mysql-clientプロジェクトを実行します。
操作手順1:spring-jdbc-mysql-clientプロジェクトをEclipseにインポートする
Eclipseを開き、メニューバーから File -> Open Projects from File System を選択します。
表示されたダイアログボックスで、Directory ボタンをクリックしてプロジェクトのディレクトリを選択し、Finish をクリックしてインポートを完了します。
説明
Eclipseを使用してMavenプロジェクトをインポートすると、Eclipseはプロジェクト内の
pom.xmlファイルを自動的に検出し、ファイルに記述された依存関係に基づいて必要な依存ライブラリを自動的にダウンロードしてプロジェクトに追加します。プロジェクトの状況を確認します。
操作手順2:OceanBase CloudクラウドデータベースのURLを取得する
- OceanBase Cloudクラウドデータベースコンソールにログインします。インスタンス一覧ページで対象インスタンスの情報を展開し、対象テナントの下で 接続 > 接続文字列を取得 を選択します。
詳細な操作については、接続文字列の取得をご参照ください。
作成済みのOceanBase Cloudクラウドデータベースに基づいて、以下のURLの対応する情報を入力します。
jdbc:mysql://$host:$port/$database_name?user=$user_name&password=$password&useSSL=false
パラメータ説明:
* `$host`:OceanBase Cloudクラウドデータベースの接続アドレスを指定します。例:`t********.********.oceanbase.cloud`。
* `$port`:OceanBase Cloudクラウドデータベースの接続ポートを指定します。デフォルトは3306です。
* `$database_name`:アクセスするデータベース名を指定します。
<main id="notice" type='notice'>
<h4>注意</h4>
<p>テナントに接続するアカウントは、該当データベースに対する<code>CREATE</code>、<code>INSERT</code>、<code>UPDATE</code>、<code>DELETE</code>、<code>SELECT</code>、および<code>DROP</code>権限を持っている必要があります。アカウント権限の詳細については、<a href="../../../../600.clusters-management-flagship/200.tenants-management-flagship/1100.database-account-flagship/100.create-account-flagship.md">アカウントの作成と管理</a>をご参照ください。</p>
</main>
* `$user_name`:データベースにアクセスするアカウントを指定します。
* `$password`:アカウントのパスワードを指定します。
MySQL Connector/Jの接続プロパティの詳細については、Configuration Propertiesをご参照ください。
例:
```shell
jdbc:mysql://t********.********.oceanbase.cloud:3306/test?user=mysql001&password=******&useSSL=false
```
操作手順3:spring-jdbc-mysql-clientプロジェクト内のデータベース接続情報を変更する
手順2:OceanBase CloudクラウドデータベースのURLを取得する で取得した情報に基づいて、ファイルspring-jdbc-mysql-client/src/main/java/com/example/Main.java内のデータベース接続情報を変更します。
例:
- OceanBase Cloudクラウドデータベースの接続アドレスは
t5******.********.oceanbase.cloudです。 - アクセスポートは3306を使用します。
- アクセスするデータベース名は
testです。 - テナントの接続アカウントは
mysql001です。 - パスワードは
******です。
コードは以下の通りです:
...
String url = "t********.********.oceanbase.cloud:3306/test?useSSL=false";
String username = "mysql001";
String password = "******";
...
操作手順4:spring-jdbc-mysql-clientプロジェクトを実行する
プロジェクトナビゲータービューで、src/main/java ディレクトリを見つけて展開します。
Main.java ファイルを右クリックし、Run As -> Java Application を選択します。
Eclipseのコンソールウィンドウで出力結果を確認します。
よくある質問
1. 接続タイムアウト
接続タイムアウトの問題が発生した場合は、JDBC URLで接続タイムアウトパラメータを設定できます:
jdbc:mysql://host:port/database?connectTimeout=30000&socketTimeout=60000
2. 文字セットの問題
正しい文字エンコーディングを確保するために、JDBC URLで正しい文字セットパラメータを設定します:
jdbc:mysql://host:port/database?characterEncoding=utf8&useUnicode=true
3. SSL接続
OceanBase CloudクラウドデータベースとのSSL接続を有効にするには、JDBC URLに以下のパラメータを追加します:
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を使用する場合、アカウントのパスワードにハッシュ記号(#)が含まれていないことを確認してください。含まれていると、接続エラーが発生する可能性があります。</p>
</main>
プロジェクトコードの紹介
spring-jdbc-mysql-client をクリックしてプロジェクトコードをダウンロードします。これはspring-jdbc-mysql-client.zipという名前の圧縮パッケージです。
解凍すると、spring-jdbc-mysql-clientという名前のフォルダが作成されます。ディレクトリ構造は以下の通りです:
spring-jdbc-mysql-client
├── src
│ └── main
│ └── java
│ └── com
│ └── example
│ └── Main.java
└── pom.xml
ファイルの説明:
src:ソースコードのルートディレクトリ。main:メインコードディレクトリ。アプリケーションの主要なロジックが含まれます。java:Javaソースコードディレクトリ。com:Javaパッケージディレクトリ。example:サンプルプロジェクトのパッケージディレクトリ。Main.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>を使用して、プロジェクト名をspring-jdbc-mysql-clientに指定します。<version>を使用して、プロジェクトのバージョン番号を1.0-SNAPSHOTに指定します。
コードは以下の通りです:
```java
<groupId>com.example</groupId>
<artifactId>spring-jdbc-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version>
```
- プロジェクトソースファイルのプロパティの設定。
Mavenのコンパイラプラグインをmaven-compiler-pluginに指定し、ソースコードとターゲットのJavaバージョンを両方とも8に設定します。これは、プロジェクトのソースコードがJava 8の機能を使用して記述され、コンパイル後のバイトコードもJava 8ランタイム環境と互換性を持つことを意味します。この設定により、プロジェクトのコンパイル時および実行時にJava 8の構文と機能を正しく処理できるようになります。
<main id="notice" type='explain'>
<h4>説明</h4>
<p>Java 1.8とJava 8は、同じバージョンの異なる命名方法です。</p>
</main>
コードは以下の通りです:
```java
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
```
プロジェクトが依存するコンポーネントの設定。
データベースと対話するために、
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>
```
spring-jdbc依存ライブラリを追加します:<groupId>を使用して、依存関係が属する組織をorg.springframeworkに指定します。<artifactId>を使用して、依存関係の名前をspring-jdbcに指定します。<version>を使用して、依存関係のバージョン番号を5.2.0.RELEASEに指定します。
コードは以下の通りです:
```java
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
```
Main.javaコードの紹介
Main.javaファイルはサンプルプログラムの一部であり、Spring JDBCフレームワークを使用してデータベース操作を実行する方法を示しています。まずデータベース接続情報を設定し、次にJdbcTemplateオブジェクトを作成してデータベース操作を実行します。コードには、テーブルの作成、データの挿入、データのクエリの例も含まれています。
本書のMain.javaファイルのコードは、主に以下の部分で構成されています:
パッケージの定義と必要なクラスのインポート。
現在のコードが属するパッケージ名を
com.exampleとして宣言します。JdbcTemplateクラスをインポートします。これはSpring JDBCフレームワークのコアクラスであり、データベース操作を実行するために使用されます。DriverManagerDataSourceクラスをインポートします。これはSpringが提供するDataSourceインターフェースを実装したデータソースクラスであり、データベース接続情報を設定するために使用されます。
コードは以下の通りです:
```java
package com.example;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
```
Mainクラスを作成し、mainメソッドを定義します。プログラムのエントリポイントとして、
Mainという名前のパブリッククラスを定義します。クラス名はファイル名と一致させる必要があります。プログラムの実行開始点として、パブリック静的メソッド
mainを定義します。その他のデータベース操作。
コードは以下の通りです:
```java
public class Main {
public static void main(String[] args) {
// 数据库连接信息 // 创建数据源 // 创建 JdbcTemplate 对象 // 创建表 // 插入数据 // 更新数据 // 删除数据 // 查询数据 // 删除表 } } ```
- データベース接続情報の定義。
データベース接続に使用するURL、ユーザー名、パスワードを定義します。$host、$port、$database_name、$user_name、および$passwordを実際のデータベース接続情報に置き換える必要があります。
コードは以下の通りです:
```java
String url = "jdbc:mysql://$host:$port/$database_name?useSSL=false";
String username = "$user_name";
String password = "$password";
```
パラメータの説明:
* `$host`:OceanBase Cloudクラウドデータベースの接続アドレスを指定します。例:`t********.********.oceanbase.cloud`。
* `$port`:OceanBase Cloudクラウドデータベースの接続ポートを指定します。デフォルトは3306です。
* `$database_name`:アクセスするデータベース名を指定します。
* `$user_name`:データベースにアクセスするアカウントを指定します。
* `$password`:アカウントのパスワードを指定します。
- データソースの作成。
DriverManagerDataSourceオブジェクトを作成し、ドライバクラス名、データベースURL、ユーザー名、パスワードなどのデータベース接続関連情報を設定します。具体的な手順は以下の通りです:
- データベース接続情報を設定するために、
DriverManagerDataSourceオブジェクトを作成します。 - ドライバクラス名の設定:
setDriverClassNameメソッドを呼び出して、データベースドライバクラス名をcom.mysql.jdbc.Driverに設定します。 - データベースURLの設定:
setUrlメソッドを呼び出して、データベースのURLを設定します。 - ユーザー名の設定:
setUsernameメソッドを呼び出して、データベースのユーザー名を設定します。 - パスワードの設定:
setPasswordメソッドを呼び出して、データベースのパスワードを設定します。
コードは以下の通りです:
```java
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
```
JdbcTemplateオブジェクトの作成。
JdbcTemplateオブジェクトを作成します。これはSpring JDBCフレームワークのコアクラスの1つです。JdbcTemplateは、SQL文の実行、データの更新、データのクエリなどのデータベース操作を実行するメソッドを提供します。
コードは以下の通りです:
```java
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
```
テーブルの作成。
テーブルを作成するSQL文を定義します。SQL文ではテーブル名を
test_springjdbcに指定し、idという名前のINT型列と、nameという名前のVARCHAR(20)型列の2つの列を定義します。テーブル作成のSQL文を実行します。
jdbcTemplateオブジェクトはexecuteメソッドを呼び出して、上記で定義したテーブル作成のSQL文を実行します。コンソールにテーブル作成成功のメッセージを出力します。
コードは以下の通りです:
```java
String createTableSql = "CREATE TABLE test_springjdbc (id INT, name VARCHAR(20))";
jdbcTemplate.execute(createTableSql);
System.out.println("Create table successfully.");
```
データの挿入。
データを挿入するSQL文を定義します。SQL文では挿入先のテーブルを
test_springjdbc、列をidとnameに指定し、(1,'A1')、(2,'A2')、および(3,'A3')の3行のデータを挿入します。データ挿入のSQL文を実行します。
jdbcTemplateオブジェクトはupdateメソッドを呼び出して、上記で定義したデータ挿入のSQL文を実行します。コンソールにデータ挿入成功のメッセージを出力します。
コードは以下の通りです:
```java
String insertDataSql = "INSERT INTO test_springjdbc (id,name) VALUES (1,'A1'), (2,'A2'), (3,'A3')";
jdbcTemplate.update(insertDataSql);
System.out.println("Insert data successfully.");
```
データの更新。
データベーステーブル
test_springjdbc内のidが1であるレコードのnameフィールドの値をA11に更新するSQL文を定義します。jdbcTemplateオブジェクトを介してSQL文を実行し、更新操作をデータベースに適用します。コンソールにデータ更新成功のメッセージを出力します。
コードは以下の通りです:
```java
String updateDataSql = "UPDATE test_springjdbc SET name = 'A11' WHERE id = 1";
jdbcTemplate.update(updateDataSql);
System.out.println("Update data successfully.");
```
データの削除。
データベーステーブル
test_springjdbcからidが2であるレコードを削除するSQL文を定義します。jdbcTemplateオブジェクトを介してSQL文を実行し、削除操作をデータベースに適用します。コンソールにデータ削除成功のメッセージを出力します。
コードは以下の通りです:
```java
String deleteDataSql = "DELETE FROM test_springjdbc WHERE id = 2";
jdbcTemplate.update(deleteDataSql);
System.out.println("Delete data successfully.");
```
データのクエリ。
データをクエリするSQL文を定義します。SQL文では
SELECT *を使用してすべての列を選択し、test_springjdbcテーブルからデータをクエリします。データクエリのSQL文を実行します。
jdbcTemplateオブジェクトはqueryメソッドを呼び出して、上記で定義したデータクエリのSQL文を実行し、コールバック関数をパラメータとして受け取ります。コールバック関数内のコードは、
ResultSetオブジェクト(rs)を使用してクエリ結果の各行のデータを取得し、処理します。コールバック関数はgetIntおよびgetStringメソッドを使用してResultSetオブジェクトからidおよびname列の値を取得し、コンソールに出力します。最後に、コールバック関数はnullを返します。コンソールにデータクエリ成功のメッセージを出力します。
コードは以下の通りです:
```java
String selectDataSql = "SELECT * FROM test_springjdbc";
jdbcTemplate.query(selectDataSql, (rs, rowNum) -> {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("id: " + id + ", name: " + name);
return null;
});
System.out.println("Query data successfully.");
```
テーブルの削除。
データベース内のテーブル
test_springjdbcを削除するSQL文を定義します。jdbcTemplateオブジェクトを介してSQL文を実行し、テーブル削除操作をデータベースに適用します。テーブル削除成功のメッセージを出力します。
コードは以下の通りです:
```java
String deleteTableSql = "DROP TABLE test_springjdbc";
jdbcTemplate.execute(deleteTableSql);
System.out.println("Table drop successfully.");
```
完全なコードの表示
```java
<?xml version="1.0" encoding="UTF-8"?>
<build>
<plugins>
<plugin>
<dependencies>
<dependency>
```java
package com.example;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class Main { public static void main(String[] args) { // Database Connect Information String url = "jdbc:mysql://$host:$port/$database_name?useSSL=false"; String username = "$user_name"; String password = "$password";
// create data source DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password);
// Create a JdbcTemplate object JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// Create table String createTableSql = "CREATE TABLE test_springjdbc (id INT, name VARCHAR(20))"; jdbcTemplate.execute(createTableSql); System.out.println("Create table successfully.");
// Insert data String insertDataSql = "INSERT INTO test_springjdbc (id,name) VALUES (1,'A1'), (2,'A2'), (3,'A3')"; jdbcTemplate.update(insertDataSql); System.out.println("Insert data successfully.");
// Update data String updateDataSql = "UPDATE test_springjdbc SET name = 'A11' WHERE id = 1"; jdbcTemplate.update(updateDataSql); System.out.println("Update data successfully.");
// Delete data String deleteDataSql = "DELETE FROM test_springjdbc WHERE id = 2"; jdbcTemplate.update(deleteDataSql); System.out.println("Delete data successfully.");
// Query data String selectDataSql = "SELECT * FROM test_springjdbc"; jdbcTemplate.query(selectDataSql, (rs, rowNum) -> { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("id: " + id + ", name: " + name); return null; }); System.out.println("Query data successfully.");
// Delete table String deleteTableSql = "DROP TABLE test_springjdbc"; jdbcTemplate.execute(deleteTableSql); System.out.println("Table drop successfully."); } } ```
ベストプラクティス
トランザクション管理
@Transactional
public void transferMoney(String fromAccount, String toAccount, BigDecimal amount) {
// トランザクション操作
}
関連情報
MySQL Connector/Jの詳細については、MySQL Connector/Jの概要をご参照ください。