本ドキュメントでは、Hibernate フレームワークと OceanBase Cloud クラウドデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、データのクエリなどの基本操作を実装する方法について説明します。
前提条件
- OceanBase Cloud のアカウントを登録し、クラスタインスタンスと MySQL互換モード のテナントを作成していること。詳細は、クラスタインスタンスの作成 および テナントの作成 をご参照ください。
- JDK 1.8 および Maven をインストールしていること。
- IntelliJ IDEA をインストールしていること。
説明
本ドキュメントでコードを実行するために使用しているツールは IntelliJ IDEA 2021.3.2 (Community Edition) ですが、個人の好みに応じて適切なツールを選択してサンプルコードを実行することもできます。
操作手順
説明
本ドキュメントに記載されている手順は、Windows 環境に基づいて作成されています。他のオペレーティングシステム環境やコンパイラを使用している場合、手順が若干異なる場合があります。
- OceanBase Cloud の接続文字列を取得します。
java-oceanbase-hibernateプロジェクトを IDEA にインポートします。java-oceanbase-hibernateプロジェクト内のデータベース接続情報を変更します。java-oceanbase-hibernateプロジェクトを実行します。
操作手順 1:OceanBase Cloud の接続文字列を取得する
OB Cloudクラウドデータベースコンソール にログインします。インスタンスリストページで対象インスタンスの情報を展開し、対象テナントの下で 接続 > 接続文字列を取得 を選択します。
詳細な操作については、接続文字列の取得 をご参照ください。
作成済みの OceanBase Cloud に基づいて、以下の URL の対応する情報を入力します。
説明
hibernate.cfg.xmlファイルでこの URL 情報が必要になります。jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$passwordパラメータの説明:
host:OceanBase Cloud の接続アドレスを指定します。例:t********.********.oceanbase.cloud。port:OceanBase Cloud の接続ポートを指定します。デフォルトは 3306 です。schema_name:アクセスする Schema 名を指定します。user_name:データベースにアクセスするためのアカウントを指定します。password:アカウントのパスワードを指定します。
URL パラメータの詳細については、データベース URL をご参照ください。
操作手順 2:java-oceanbase-hibernate プロジェクトを IDEA にインポートする
IntelliJ IDEA を開き、File > Open... オプションを選択します。
ポップアップ表示された Open File or Project ウィンドウで、対応するプロジェクトファイルを選択し、OK をクリックしてプロジェクトファイルのインポートを完了します。
IntelliJ IDEA はプロジェクト内の各種ファイルを自動的に認識し、Project ツールウィンドウでプロジェクトのディレクトリ構造、ファイルリスト、モジュールリスト、依存関係などの情報を確認できます。Project ツールウィンドウは通常、IntelliJ IDEA インターフェースの左端にあり、デフォルトで開いています。Project ツールウィンドウが閉じている場合は、メニューバーの View > Tool Windows > Project をクリックするか、ショートカットキー Alt + 1 を使用して再度開くことができます。
説明
IntelliJ IDEA を使用してプロジェクトをインポートすると、IntelliJ IDEA はプロジェクト内の pom.xml ファイルを自動的に検出し、ファイルに記述された依存関係に基づいて必要な依存ライブラリを自動的にダウンロードしてプロジェクトに追加します。
プロジェクトの状況を確認します。
操作手順 3:java-oceanbase-hibernate プロジェクト内のデータベース接続情報を変更する
手順 1:OceanBase Cloud の接続文字列を取得する の情報に基づいて、hibernate.cfg.xml ファイル内のデータベース接続情報を変更します。
説明
JDBC 接続文字列に追加の属性情報を追加する必要がある場合は、データベース URL をご参照ください。
例は以下の通りです:
- データベースドライバ名は
com.mysql.cj.jdbc.Driverです。 - OceanBase Cloud の接続アドレスは
t5******.********.oceanbase.cloudです。 - アクセスポートは 3306 を使用します。
- アクセスする Schema 名は
testです。 - テナントの接続アカウントは
mysql001です。 - パスワードは
******です。
サンプルコードは以下の通りです:
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://t5******.********.oceanbase.cloud:3306/test</property>
<property name="hibernate.connection.username">mysql001</property>
<property name="hibernate.connection.password">******</property>
操作手順 4:java-oceanbase-hibernate プロジェクトを実行する
実行パス
- プロジェクト構造の src > test > java で
TestHibernate.javaファイルを見つけます。 - ツールメニューバーで 実行(U) > 実行 > TestHibernate を選択するか、右上の緑色の三角形を直接クリックして実行します。
- IDEA のコンソールを通じて、プロジェクトのログ情報と出力結果を確認します。
実行結果
User{id=2, name='update'}
User{id=3, name='user_insert3'}
User{id=4, name='user_insert4'}
User{id=5, name='user_insert5'}
よくある質問
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");
注意
MySQL Connector/J 8.x を使用する場合、アカウントパスワードにハッシュ記号 (#) が含まれていないことを確認してください。含まれていると、接続エラーが発生する可能性があります。
プロジェクトコードの紹介
java-oceanbase-hibernate をクリックしてプロジェクトコードをダウンロードします。これは java-oceanbase-hibernate.zip という名前の圧縮パッケージです。
解凍すると、java-oceanbase-hibernate という名前のフォルダが作成されます。ディレクトリ構造は以下の通りです:
│--pom.xml
│
├─.idea
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ ├─dao
│ │ │ │ └─--UserDao.java
│ │ │ │
│ │ │ └─pojo
│ │ │ └─--User.java
│ │ │
│ │ └─resources
│ │ │--hibernate.cfg.xml
│ │ │
│ │ └─com
│ │ └─oceanbase
│ │ └─pojo
│ │ └─--User.hbm.xml
│ │
│ └─test
│ └─java
│ └─--TestHibernate.java
│
└─target
ファイルの説明:
pom.xml:Maven プロジェクトの設定ファイルで、プロジェクトの依存関係、プラグイン、ビルドなどの情報が含まれています。.idea:IDE(統合開発環境)で使用されるディレクトリで、プロジェクト関連の設定情報を保存するために使用されます。src:通常、プロジェクト内でソースコードを保存するディレクトリを表すために使用されます。main: 主要なソースコードとリソースファイルを保存するディレクトリです。java: Java ソースコードを保存するディレクトリです。com: Java パッケージのルートディレクトリです。oceanbase: プロジェクトのルートディレクトリです。dao: データアクセスオブジェクト(Data Access Object)パッケージを保存し、データベースやその他のデータストレージサービスにアクセスするために使用されます。UserDao.java:ユーザーデータアクセスオブジェクトで、ユーザーデータの追加、削除、変更、クエリなどの操作に使用されます。User.java:ユーザー永続化オブジェクトで、ユーザーデータテーブルのフィールドをマッピングするために使用されます。pojo: 永続化オブジェクト(Plain Old Java Object)で、データベーステーブルに対応する Java クラスを保存します。データベーステーブルやその他のデータストレージ構造をマッピングするために使用されます。resources: 設定ファイルや SQL ファイルなどのリソースファイルを保存するディレクトリです。hibernate.cfg.xml: Hibernate の設定ファイルを保存し、Hibernate の基本パラメータやデータソースの設定などに使用されます。User.hbm.xml: ユーザー永続化オブジェクトのマッピングファイルを保存し、ユーザー永続化オブジェクトとユーザーデータテーブル間のマッピング関係を定義するために使用されます。test: テストコードとリソースファイルを保存するディレクトリです。TestHibernate.java: Hibernate をテストする Java クラスを保存します。target: コンパイル後の Class ファイルや Jar パッケージなどのファイルを保存するディレクトリです。
pom.xml コードの紹介
説明
サンプルを検証するだけであれば、デフォルトのコードを使用し、変更する必要はありません。以下の説明に従って、必要に応じて pom.xml ファイルを変更することもできます。
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に指定します。
コードは以下の通りです:
<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.oceanbaseに指定します。<artifactId>を使用してプロジェクト依存関係をjava-oceanbase-hibernateに指定します。<version>を使用してプロジェクトのバージョン番号を1.0-SNAPSHOTに指定します。
コードは以下の通りです:
<groupId>com.oceanbase</groupId>
<artifactId>java-oceanbase-hibernate</artifactId>
<version>1.0-SNAPSHOT</version>
<build>を使用してプロジェクトのビルドプロセスを定義します。<plugins>を使用してプロジェクトに設定されたプラグインを指定します。
<plugin>を使用してプロジェクトに 1 つのプラグインを設定します。<groupId>を使用してプロジェクト識別子をorg.apache.maven.pluginsに指定します。<artifactId>を使用してプロジェクト依存関係をmaven-compiler-pluginに指定します。<configuration>を使用して設定されたプラグインのパラメータを指定します。<source>を使用してコンパイラのソースコードバージョンを 8 に指定します。<target>を使用してコンパイラのソースコードバージョンを 8 に指定します。
コードは以下の通りです:
<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>
<dependencies>を使用してプロジェクトが依存するコンポーネントを定義します。依存関係が属する組織を
com.oceanbase、名前をoceanbase-client、バージョン番号を2.4.2に指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
```
- 依存関係が属するテストフレームワークを
junit、名前をjunit、バージョン番号を4.13に指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
```
- 依存関係が属するフレームワークを
org.hibernate、コアライブラリをhibernate-core、バージョン番号を5.2.17.Finalに指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
</dependencies>
```
- 依存関係が属するフレームワークを
org.hibernate、データソースライブラリをhibernate-c3p0、バージョン番号を5.2.17.Finalに指定します。
コードは以下の通りです:
```java
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.17.Final</version>
</dependency>
</dependencies>
```
User.hbm.xml コードの紹介
User.hbm.xml ファイルは Hibernate のマッピングファイルであり、Java オブジェクトをデータベース内のテーブルにマッピングするために使用されます。
User.hbm.xml ファイルのコードは主に以下の部分で構成されています:
- ファイル宣言文。
このファイルが XML ファイルであり、使用する XML バージョンが 1.0、文字エンコーディングが UTF-8 であることを宣言します。同時に、Hibernate マッピングファイルの DTD バージョンと場所を指定し、DTD ドキュメントタイプを hibernate-mapping、バージョンを 3.0、言語を EN、ファイルが存在する URL を http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd に指定します。
コードは以下の通りです:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
-//Hibernate/Hibernate Mapping DTD 3.0//EN
http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
```
2. マッピングファイルの設定。
Hibernate マッピングファイルを定義し、`User` という名前のエンティティクラスを `test_hibernate_mysql` という名前のデータベーステーブルにマッピングします。
1. `package` 属性を使用して、マッピングファイル内の Java パッケージを `com.oceanbase.pojo` に指定します。
2. `class` タグを使用してデータテーブル内のデータをマッピングし、`name` 属性で Java クラス名を `User` に、`table` 属性でデータベーステーブル名を `test_hibernate_mysql` に指定します。
3. `id` を使用して主キー属性を定義し、`name` 属性で Java クラス `User` のメンバ変数を `id` に、`column` 属性でデータベースフィールド名を `USER_ID` に指定します。
4. `generator` を使用して主キー生成戦略を定義し、`class` 属性で主キー生成器のタイプを `sequence` に、`param` 要素でデータベース内のシーケンス名を `SQ_USER` に指定し、`name` 属性でこの属性がデータベーステーブルの `USER_NAME` 列に対応することを指定し、この属性のデータ型を文字列に指定します。
**コードは以下の通りです:**
```xml
<hibernate-mapping package="com.oceanbase.pojo">
<class name="User" table="test_hibernate_mysql">
<!-- Configure primary key generation strategy -->
<id name="id" column="USER_ID">
<generator class="sequence">
<param name="sequence">SQ_USER</param>
</generator>
</id>
<!-- Configuration Tables and Properties -->
<property name="name" column="USER_NAME" type="string"/>
</class>
</hibernate-mapping>
```
### hibernate.cfg.xml コードの紹介
`hibernate.cfg.xml` ファイルは Hibernate の設定ファイルであり、Hibernate の実行環境やデータベース接続パラメータを設定するために使用されます。
`hibernate.cfg.xml` ファイルのコードは主に以下の部分で構成されています:
1. ファイル宣言文。
このファイルが XML ファイルであり、使用する XML バージョンが `1.0`、文字エンコーディングが `UTF-8` であることを宣言します。同時に、Hibernate 設定ファイルの DTD バージョンと場所を指定し、DTD ドキュメントタイプを `hibernate-configuration`、バージョンを 3.0、言語を EN、ファイルが存在する URL を `http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd` に指定します。
**コードは以下の通りです:**
```xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
-//Hibernate/Hibernate Configuration DTD 3.0//EN
http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
```
2. `configuration` パラメータの設定。
<hibernate-configuration> ルート要素内で <session-factory> 要素を使用して Hibernate のセッションファクトリを設定し、セッションオブジェクトの作成と管理に使用します。セッションファクトリには、データベース接続のドライバクラス名、URL、ユーザー名とパスワード、接続プールの関連パラメータ、データベースダイアレクト、SQL 出力とフォーマット、データベーステーブルの自動作成、現在のセッションコンテキスト、バッチ処理、二次キャッシュなどの設定が含まれます。
1. データベース情報の設定。
Hibernate とデータベース接続のパラメータを設定します。これには、データベース接続のドライバクラス名、URL、ユーザー名、パスワードが含まれます。
* `hibernate.connection.driver_class` を使用してデータベースドライバを `com.mysql.cj.jdbc.Driver` に指定し、OceanBase Cloud との接続を確立するために使用します。
* `hibernate.connection.url` 要素を使用してデータベースの URL を指定します。これには、データベースのアドレス、ポート番号、データベース名などの情報が含まれます。
* `hibernate.connection.username` 要素を使用してデータベース接続のユーザー名を指定します。
* `hibernate.connection.password` 要素を使用してデータベース接続のパスワードを指定します。
**コードは以下の通りです:**
```xml
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:oceanbase://host:port/schema_name</property>
<property name="hibernate.connection.username">user_name</property>
<property name="hibernate.connection.password">******</property>
- 接続プール情報の設定。
Hibernate が使用する接続プールの関連パラメータを設定します。接続プールを C3P0 に指定し、接続プールの最大および最小接続数、タイムアウト時間、接続の最大アイドル時間、キャッシュされる Statement オブジェクトの数、接続のアイドルテスト時間、一度に取得する接続数、および接続の検証方法などのパラメータを設定します。
説明
以下のパラメータは参考用であり、完全にサポートされているパラメータのリストではありません。他のパラメータを設定する必要がある場合は、関連ドキュメントを参照して詳細なパラメータ情報を取得してください。
* `hibernate.connection.provider_class` を使用して接続プールを C3P0 に指定し、データベース接続の作成と解放を管理するために使用します。
* `hibernate.c3p0.max_size` を使用して接続プールの最大接続数を 60 に指定します。
* `hibernate.c3p0.min_size` を使用して接続プールの最小接続数を 30 に指定します。
* `hibernate.c3p0.checkoutTimeout` を使用して接続プールが接続を取得するタイムアウト時間を 30000 ミリ秒に指定します。
* `hibernate.c3p0.timeout` を使用して接続プールの最大アイドル時間を 2000 ミリ秒に指定し、この時間を超えると閉じられます。
* `hibernate.c3p0.max_statements` を使用して接続プールにキャッシュされる最大 SQL 文の数を 100 に指定します。
* `hibernate.c3p0.idle_test_period` を使用して接続プール内のアイドル接続の検出周期を 3000 ミリ秒に指定します。
* `hibernate.c3p0.acquire_increment` を使用して接続プールが動的に増加する際の接続数の増分を 3 に指定します。
* `hibernate.c3p0.validate` を使用して接続プールの接続時の検証を true に指定します。
コードは以下の通りです:
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">60</property>
<property name="hibernate.c3p0.min_size">30</property>
<property name="hibernate.c3p0.checkoutTimeout">30000</property>
<property name="hibernate.c3p0.timeout">20000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.validate">true</property>
- SQL 対話情報の設定。 Hibernate とデータベース接続の関連情報を設定します。これには、データベースダイアレクト、SQL の出力とフォーマット、テーブルの自動作成、現在のセッションコンテキスト、バッチサイズ、キャッシュの使用、およびマッピングファイルの読み込みが含まれます。 *特定のデータベースとの互換性を確保するため、
dialectを使用して、使用するデータベースダイアレクトを MySQL 5.7 に指定します。hibernate.show_sqlを使用して、Hibernate が生成した SQL 文をコンソールに出力するかどうかを設定します。hibernate.format_sqlを使用して、出力される SQL 文をフォーマットするかどうかを設定します。hbm2ddl.autoを使用してテーブルの自動作成を設定します。current_session_context_classを使用してスレッドレベルの現在のセッションコンテキストを使用するように指定します。hibernate.jdbc.batch_sizeを使用してバッチ処理のサイズを設定します。hibernate.cache.use_second_level_cacheを使用して二次キャッシュを有効にするかどうかを設定します。- 読み込むマッピングファイルを
com/oceanbase/pojo/User.hbm.xmlに指定します。
コードは以下の通りです:
```xml
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.jdbc.batch_size">10</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<mapping resource="com/oceanbase/pojo/User.hbm.xml"/>
```
UserDao.java コードの紹介
UserDao.java ファイルは、ユーザーデータアクセスオブジェクト(DAO)クラスを通じて、Session オブジェクトを使用してユーザーデータの追加、削除、変更、クエリ操作を実装します。
UserDao.java ファイルのコードは主に以下の部分で構成されています:
- 他のクラスとインターフェースの参照。
現在のファイルに以下のインターフェースとクラスが含まれていることを宣言します:
* `User` クラス:ユーザーオブジェクトの操作に使用されます。
* `Session` クラス:データベースとの対話に使用されます。
* `SessionFactory` クラス:Session インスタンスの作成に使用されます。
* `Transaction` クラス:データベーストランザクションの管理に使用されます。
* `Configuration` クラス:Hibernate の設定ファイルの読み込みに使用されます。
* `Query` クラス:クエリ操作の実行に使用されます。
* `List` インターフェース:クエリ結果セットの操作に使用されます。
コードは以下の通りです:
```java
import com.oceanbase.pojo.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
```
UserDaoクラスの定義。
UserDao という Java クラスをデータアクセスオブジェクトとして使用し、ユーザーオブジェクトの永続化操作を行います。このクラスは、データベースとの対話に関連する一連のメソッドをカプセル化し、ユーザーオブジェクトの追加、削除、変更、クエリなどの操作を行います。UserDao クラスのメソッドを呼び出すことで、データベースと簡単に対話し、永続化操作を実現できます。
UserDaoクラスインスタンスの初期化操作。
オブジェクト初期化ブロックを使用して、クラスのインスタンス化プロセス中に Session オブジェクトを初期化します。
まず Configuration オブジェクトを作成し、configure メソッドを呼び出して Hibernate の設定ファイル(hibernate.cfg.xml)を読み込みます。次に、buildSessionFactory メソッドを呼び出して SessionFactory オブジェクトを作成します。最後に、openSession メソッドを呼び出して Session オブジェクトを作成し、それを session 変数に代入します。
コードは以下の通りです:
```java
private Session session;
{
Configuration cfg = new Configuration().configure();
// Create SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
} //Read the hibernate.cfg.xml file
```
- ID を指定して対応するユーザー情報をクエリする。
selectUserById メソッドを通じて、提供された ID パラメータで対応するユーザー情報をクエリします。
session の get メソッドを使用し、渡された User.class と ID パラメータを通じて、データベースから対応する ID の User レコードを取得し、それを user 変数に保存します。
コードは以下の通りです:
```java
public User selectUserById(int ID) {
User user = session.get(User.class, ID);
return user;
}
```
- ユーザー名に基づいてユーザー情報をクエリする。
selectUserbyName メソッドを通じて、ユーザー名に基づいてユーザー情報をクエリします。 まず、指定された名前のユーザーデータをクエリするための HQL(Hibernate Query Language)文を定義します。ここで、テーブル名は test_hibernate_mysql、テーブルのエイリアスは u、クエリフィールド名は name です。Session オブジェクトの createQuery メソッドを使用して Query オブジェクトを作成し、HQL 文とエンティティクラスをパラメータとして渡します。Query オブジェクトの setParameter メソッドを使用してクエリパラメータを設定します。ここで 0 はパラメータの位置を示し、name はパラメータの値を示します。Query オブジェクトの list メソッドを使用してクエリを実行し、クエリ結果を User オブジェクトのリストに変換します。
コードは以下の通りです:
```java
public List<User> selectUserbyName(String name) {
String sql = "FROM test_hibernate_mysql u WHERE u.name =?";
Query<User> query = session.createQuery(sql, User.class);
query.setParameter(0, name);
List<User> users = query.list();
return users;
}
```
- すべてのユーザーデータをクエリする。
selectUser メソッドを通じて、すべてのユーザーデータをクエリするメソッドを実装します。 すべてのユーザーデータをクエリするための SQL 文を定義します。Session オブジェクトの createNativeQuery メソッドを使用して Query オブジェクトを作成し、SQL 文をパラメータとして渡します。次に、addEntity メソッドを使用してエンティティクラス User をクエリに追加し、クエリ結果を User オブジェクトのリストに変換できるようにします。Query オブジェクトの getResultList メソッドを使用してクエリを実行し、クエリ結果を User オブジェクトのリストに変換します。
コードは以下の通りです:
```java
public List<User> selectUser() {
String sql = "SELECT * FROM test_hibernate_mysql";
Query<User> query = session.createNativeQuery(sql).addEntity(User.class);
List<User> users = query.getResultList();
return users;
}
```
- ユーザーデータを挿入する。
insertUser メソッドを通じて、ユーザー情報を挿入します。 挿入するユーザーオブジェクトを渡すために、User 型のパラメータ user を指定します。Hibernate Session の beginTransaction メソッドを呼び出してトランザクションオブジェクトを作成し、それを変数 beginTransaction に保存します。save メソッドを使用してユーザーオブジェクトをデータベースに保存します。Session の getTransaction メソッドを呼び出して現在のトランザクションを取得し、commit メソッドを呼び出してトランザクションをコミットし、これまでの操作をデータベースに永続化して、挿入操作の結果を返します。
コードは以下の通りです:
```java
public int insertUser(User user) {
// open transaction
Transaction beginTransaction = session.beginTransaction();
session.save(user);
session.getTransaction().commit();
return 1;
}
```
- ユーザーデータを削除する。
deleteUserById メソッドを通じて、渡された ID に対応するユーザーレコードをデータベースから削除します。 削除するユーザー ID を渡すために、整数型パラメータ id を指定します。Hibernate Session の beginTransaction メソッドを呼び出して新しいトランザクションを開始します。get メソッドを使用して、指定されたユーザー ID とエンティティクラスタイプ(User.class)に基づいて対応するユーザーオブジェクトを取得します。delete メソッドを使用してユーザーオブジェクトを削除します。Session の getTransaction メソッドを呼び出して現在のトランザクションを取得し、commit メソッドを呼び出してトランザクションをコミットし、ユーザー情報の削除をデータベースに永続化して、削除操作の結果を返します。
コードは以下の通りです:
```java
public int deleteUserById(int id) {
// open transaction
session.beginTransaction();
User user = session.get(User.class, id);
session.delete(user);
session.getTransaction().commit();
return 1;
}
```
- ユーザーデータを変更する。
updateUserById メソッドを通じて、対応するユーザー情報を更新します。 更新するユーザーデータを指定するために、User 型のパラメータ user を指定します。Session オブジェクトの beginTransaction メソッドを使用してトランザクションを開始します。Session オブジェクトの get メソッドを使用して、ユーザー ID に基づいて対応する User オブジェクトを取得します。Session オブジェクトの merge メソッドを使用して、渡された User オブジェクトと取得した User オブジェクトをマージし、渡されたユーザーデータをデータベースに更新します。Session オブジェクトの getTransaction メソッドを使用して現在のトランザクションを取得し、commit メソッドを呼び出してトランザクションをコミットし、変更操作の結果を返します。
コードは以下の通りです:
```java
public int updateUserById(User user) {
// open transaction
session.beginTransaction();
User user1 = session.get(User.class, user.getId());
session.merge(user);
session.getTransaction().commit();
return 1;
}
```
User.java コードの紹介
User.java ファイルは、ユーザーデータアクセスオブジェクト(DAO)クラスを通じて、Session オブジェクトを使用してユーザーデータの追加、削除、変更、クエリ操作を実装します。
User.java ファイルのコードは主に以下の部分で構成されています:
- 他のクラスの参照。
現在のファイルが JPA アノテーションを使用して、関連クラスとデータベーステーブルのマッピング関係を設定していることを宣言します:
* `Column` アノテーション:エンティティクラスの属性とデータベーステーブルの列の対応関係を識別するために使用されます。
* `Entity` アノテーション:データベース内のテーブルをマッピングするために使用されます。
* `GeneratedValue` アノテーション:当該属性値が自動生成されることを示すために使用されます。
* `GenerationType` アノテーション:主キー生成戦略を指定するために使用されます。
* `Id` アノテーション:一意の識別属性を指定するために使用されます。
* `Table` アノテーション:エンティティクラスに対応するテーブル名を示すために使用されます。
コードは以下の通りです:
```java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
```
- データベース内のテーブルのマッピング。
データベーステーブルのエンティティクラスをマッピングし、エンティティクラスに対応するテーブル名を test_hibernate_mysql に指定します。
コードは以下の通りです:
```java
@Entity
@Table(name = "test_hibernate_mysql")
```
Userクラスの定義。
データベース内の test_hibernate_mysql という名前のテーブルとマッピングするために使用されます。
idとnameの 2 つの属性を定義します。 アノテーションを使用して、Userクラスのidおよびname属性とデータベーステーブルの列の対応関係を識別します。@Idアノテーションを使用してid属性を主キーとして識別し、@GeneratedValueアノテーションで主キーの生成戦略をシーケンスに指定し、@Columnアノテーションで属性とデータベーステーブルの列のマッピング関係を指定します。id属性はユーザーIDの保存に使用され、name属性はユーザー名の保存に使用されます。
コードは以下の通りです:
```java
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "user_id")
private int id;
@Column(name = "user_name")
private String name;
```
Userオブジェクトの作成。
User オブジェクトを作成するために、User クラスの 2 つのコンストラクタを定義します。 Hibernate クエリ操作用に引数なしのコンストラクタを定義します。id および name 属性を初期化するために、引数ありのコンストラクタを定義します。
コードは以下の通りです:
```java
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
```
idとnameの値の取得と設定。
id および name 属性の値を取得および設定するために、User クラスの 4 つのメソッドを定義します。 getId メソッドは id 値の取得に使用され、setId メソッドは id 値の設定に使用されます。getName メソッドはユーザー名 name の値の取得に使用されます。setName メソッドはユーザー名 name の値の設定に使用されます。
コードは以下の通りです:
```java
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
```
Userオブジェクトの文字列表現を返す。
User オブジェクトの文字列表現を返すために、User クラスの toString メソッドをオーバーライドします。 @Override を定義して親クラスの同名メソッドをオーバーライドします。User オブジェクトの文字列表現を返すために toString メソッドを定義します。文字列の連結を通じて、id および name 属性の値を文字列としてフォーマットし、呼び出し元に User を返します。
コードは以下の通りです:
```java
@Override
public String toString() {
return "User{" +
id= + id + , name=' + name + ''' + }'; } ```
TestHibernate.java コードの紹介
TestHibernate.java ファイルは、UserDao オブジェクトに対して挿入、削除、更新、クエリ操作を実行することで、Hibernate の基本的なデータベース操作機能を示します。
TestHibernate.java ファイルのコードは主に以下の部分で構成されています:
- 他のクラスとインターフェースの参照。
現在のファイルに関連するクラスとインターフェースを宣言します。これには UserDao、User、Session、SessionFactory、Configuration などが含まれます。
* `UserDao` クラス:ユーザーに関連するデータベース操作の実行に使用されます。
* `User` クラス:ユーザーオブジェクトの操作に使用されます。
* `Session` クラス:データベースとのセッション操作に使用されます。
* `SessionFactory` クラス:Session オブジェクトの作成に使用されます。
* `Configuration` クラス:Hibernate の設定に使用されます。
* `SessionImpl` クラス:基盤となる JDBC 接続の取得に使用されます。
* `Test` アノテーション:テストメソッドのマークに使用されます。
* `IOException` クラス:IO 例外の処理に使用されます。
* `Connection` クラス:JDBC 接続の取得に使用されます。
* `SQLException` クラス:SQL 例外の処理に使用されます。
* `List` クラス:クエリ結果セットの保存に使用されます。
* `UUID` クラス:一意の識別子の生成に使用されます。
コードは以下の通りです:
```java
import com.oceanbase.dao.UserDao;
import com.oceanbase.pojo.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.internal.SessionImpl;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
```
testHibernateメソッドの定義。testHibernateメソッドには、挿入、削除、更新、クエリなどの基本操作が含まれています。UserDaoオブジェクトを作成し、ループで 5 件のユーザーデータを挿入します。insertUserメソッドを呼び出してユーザーデータを挿入します。deleteUserByIdメソッドを呼び出して id が 1 のユーザーデータを削除します。updateUserByIdメソッドを呼び出して id が 2 のユーザーデータを更新します。selectUserメソッドを呼び出してすべてのユーザーデータをクエリします。クエリ結果を反復処理し、コンソールに出力します。
コードは以下の通りです:
```java
public class TestHibernate {
@Test
public void testHibernate() throws SQLException, IOException {
UserDao userDao = new UserDao();
for (int i = 1; i <= 5; i++) {
userDao.insertUser(new User(i, "user_insert" + i));
}
int deleteUserById = userDao.deleteUserById(1);
int update = userDao.updateUserById(new User(2, "update"));
List<User> users = userDao.selectUser();
users.forEach(System.out::println);
}
}
```
完全なコードの表示
<?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>com.oceanbase</groupId>
<artifactId>java-oceanbase-hibernate</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
<!-- Hibernate c3p0 connection pool-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.17.Final</version>
</dependency>
</dependencies>
</project>
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
-//Hibernate/Hibernate Mapping DTD 3.0//EN
http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd>
<hibernate-mapping package="com.oceanbase.pojo">
<class name="User" table="test_hibernate_mysql">
<!-- Configure primary key generation strategy -->
<id name="id" column="USER_ID">
<generator class="sequence">
<param name="sequence">SQ_USER</param>
</generator>
</id>
<!-- Configuration Tables and Properties -->
<property name="name" column="USER_NAME" type="string"/>
</class>
</hibernate-mapping>
```
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
-//Hibernate/Hibernate Configuration DTD 3.0//EN
http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd>
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://host:port/schema_name</property>
<property name="hibernate.connection.username">user_name</property>
<property name="hibernate.connection.password">******</property>
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">60</property>
<property name="hibernate.c3p0.min_size">30</property>
<property name="hibernate.c3p0.checkoutTimeout">30000</property>
<property name="hibernate.c3p0.timeout">20000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.validate">true</property>
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.jdbc.batch_size">10</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<mapping resource="com/oceanbase/pojo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
```
package com.oceanbase.dao;
import com.oceanbase.pojo.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class UserDao {
private Session session;
{
Configuration cfg = new Configuration().configure();
// Create SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
} //Read the hibernate.cfg.xml file
// private Session session = HibernateUtil.getSession();
public User selectUserById(int ID) {
User user = session.get(User.class, ID);
return user;
}
public List<User> selectUserbyName(String name) {
String sql = "FROM test_hibernate_mysql u WHERE u.name =?";
Query<User> query = session.createQuery(sql, User.class);
query.setParameter(0, name);
List<User> users = query.list();
return users;
}
public List<User> selectUser() {
String sql = "SELECT * FROM test_hibernate_mysql";
Query<User> query = session.createNativeQuery(sql).addEntity(User.class);
List<User> users = query.getResultList();
return users;
}
public int insertUser(User user) {
// open transaction
Transaction beginTransaction = session.beginTransaction();
session.save(user);
session.getTransaction().commit();
return 1;
}
public int deleteUserById(int id) {
// open transaction
session.beginTransaction();
User user = session.get(User.class, id);
session.delete(user);
session.getTransaction().commit();
return 1;
}
public int updateUserById(User user) {
// open transaction
session.beginTransaction();
User user1 = session.get(User.class, user.getId());
session.merge(user);
session.getTransaction().commit();
return 1;
}
}
package com.oceanbase.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "test_hibernate_mysql")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "user_id")
private int id;
@Column(name = "user_name")
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
id= + id +
, name=' + name + '\'' +
}';
}
}
```java
import com.oceanbase.dao.UserDao;
import com.oceanbase.pojo.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.internal.SessionImpl;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
public class TestHibernate { @Test public void testHibernate() throws SQLException, IOException { UserDao userDao = new UserDao(); for (int i = 1; i <= 5; i++) { userDao.insertUser(new User(i, "user_insert" + i)); } int deleteUserById = userDao.deleteUserById(1); int update = userDao.updateUserById(new User(2, "update")); List
関連ドキュメント
OceanBase Connector/J の詳細については、OceanBase JDBCドライバ をご参照ください。