本記事では、HibernateフレームワークとOceanBaseデータベースを使用して、テーブルの作成、データの挿入、クエリなどの基本的な操作を実現するアプリケーションの構築方法を紹介します。
前提条件
- OceanBaseデータベースがインストール済みであること。
- JDK 1.8とMavenがインストール済みであること。
- IntelliJ IDEAがインストール済みであること。
説明
この記事でコードを実行するために使用したツールは、IntelliJ IDEA 2021.3.2(Community Edition)バージョンです。ご自身の好みに合わせて、適切なツールを選択してサンプルコードを実行することも可能です。
操作手順
説明
本記事で示されている操作手順は、Windows環境に基づいています。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
- OceanBaseデータベースの接続文字列を取得します。
java-oceanbase-hibernateプロジェクトをIDEAにインポートします。java-oceanbase-hibernateプロジェクトのデータベース接続情報を修正します。java-oceanbase-hibernateプロジェクトを実行します。
ステップ1:OceanBaseデータベースの接続文字列を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -hxx.xx.xx.xx -P2883 -uroot@sys#cluster -p**** -Aデプロイ済みのOceanBaseデータベースに基づいて、以下のURLの対応する情報を入力します。
説明
hibernate.cfg.xmlファイルには、このURL情報が必要です。jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$passwordパラメータの説明:
host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。schema_name:アクセスするスキーマ名です。user_name:-uパラメータで指定します。形式は、ユーザー名@テナント#クラスタ名 または ユーザー名@SERVICE:サービス名 です。ユーザー@テナント#クラスタ名 の形式を使用する場合、デフォルトのテナントはsys、管理者ユーザーはrootです。データベースに直接接続する場合、クラスタ名を省略できますが、ODP接続の場合は入力する必要があります。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データベースの接続文字列を取得する に記載されている情報に基づいて、hibernate.cfg.xml ファイル内のデータベース接続情報を修正します。
説明
JDBC接続文字列に追加のプロパティ情報を追加する必要がある場合は、データベースURLを参照してください。
例:
- データベースドライバーの名前:
com.mysql.cj.jdbc.Driver - OBServerノードのIPアドレスは
172.30.xxx.xxxです。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
testです。 - テナントの接続アカウントは
root@mysql001です。mysql001はOceanBaseデータベースで作成されたMySQLモードのユーザーテナントであり、rootはテナントmysql001のユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://172.30.xxx.xxx:2881/test</property>
<property name="hibernate.connection.username">root@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データベースとの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, DAO)パッケージを格納するディレクトリで、データベースや他のデータストレージサービスにアクセスするために使用されます。UserDao.java:ユーザーデータアクセスオブジェクトで、ユーザーデータの追加、削除、変更、クエリなどの操作に使用されます。User.java:ユーザー永続化オブジェクトで、ユーザーデータテーブルのフィールドをマッピングするために使用されます。pojo: 永続化オブジェクト(Plain Old Java Object, POJO)で、データベースに対応する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であることを宣言しています。コード:
<?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と指定します。コード:
<dependencies> <dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.2</version> </dependency> </dependencies>依存関係が所属するテストアーキテクチャを
junit、名前をjunit、バージョン番号を4.13と指定します。コード:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> </dependencies>依存関係が所属するアーキテクチャを
org.hibernate、コアライブラリをhibernate-core、バージョン番号を5.2.17.Finalと指定します。コード:
<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と指定します。コード:
<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">マッピングファイルを設定します。
Userという名前のエンティティクラスをtest_hibernate_mysqlという名前のデータベーステーブルにマッピングするHibernateマッピングファイルを定義します。packageプロパティを使用して、マッピングファイル内のJavaパッケージをcom.oceanbase.pojoと指定します。classタグを使用して、データテーブル内のデータをマッピングし、nameプロパティでJavaクラス名をUser、tableプロパティでデータベーステーブル名をtest_hibernate_mysqlと指定します。idを使用して、主キープロパティを定義し、nameプロパティでJavaクラスUserのメンバー変数をid、columnプロパティでデータベースフィールド名をUSER_IDと指定します。generatorを使用して、主キー生成戦略を定義します。classプロパティで主キージェネレーターのタイプをsequence、param要素でデータベース内のシーケンス名をSQ_USERと指定します。nameプロパティでこのプロパティがデータベーステーブル内のUSER_NAME列に対応することを指定し、データ型を文字列と指定します。
コード:
<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 ファイルのコードには、主に以下の部分が含まれます:
ファイル宣言ステートメントです。
このファイルが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 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">configurationパラメータを設定します。ルート要素内で 要素を使用して、Hibernateのセッションファクトリを設定します。セッションファクトリはセッションオブジェクトの作成と管理に使用されます。セッションファクトリには、データベースに接続するためのドライバークラス名、URL、ユーザー名とパスワード、接続プールの関連パラメータ、データベースの方言、SQL出力とフォーマット、データベーステーブルの自動作成、現在のセッションコンテキスト、バッチ処理と二次キャッシュなどの設定が含まれます。 データベース情報を設定します。
Hibernateとデータベース接続のパラメータを設定します。データベースに接続するためのドライバークラス名、URL、ユーザー名とパスワードが含まれます。
hibernate.connection.driver_classを使用して、データベースドライバープログラムをcom.mysql.cj.jdbc.Driverと指定します。OceanBaseデータベースとの接続を確立するために使用されます。hibernate.connection.url要素を使用して、データベースのURLを指定します。データベースのアドレス、ポート番号、データベース名などの情報が含まれます。hibernate.connection.username要素を使用して、データベースに接続するユーザー名を指定します。hibernate.connection.password要素を使用して、データベースに接続するパスワードを指定します。
コード:
<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を読み込むことを指定します。
コード:
<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インターフェース:クエリ結果セットを操作するために使用されます。
コード:
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変数に代入します。コード:
private Session session; { Configuration cfg = new Configuration().configure(); // Create SessionFactory SessionFactory sessionFactory = cfg.buildSessionFactory(); session = sessionFactory.openSession(); } //Read the hibernate.cfg.xml fileIDクエリに対応するユーザー情報を設定します。
selectUserByIdメソッドを使用して、提供されたIDパラメータに対応するユーザー情報のクエリを実行します。sessionのgetメソッドを使用して、渡されたUser.classとIDパラメータに基づいて、データベースから対応するIDのUserレコードを取得し、user変数に格納します。コード:
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オブジェクトのリストに変換します。コード:
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オブジェクトのリストに変換します。コード:
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メソッドを呼び出してトランザクションをコミットし、これまでの操作をデータベースに永続化し、挿入操作の結果を返します。コード:
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メソッドを呼び出してトランザクションをコミットし、ユーザー情報の削除をデータベースに永続化し、削除操作の結果を返します。コード:
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メソッドを呼び出してトランザクションをコミットし、更新操作の結果を返します。コード:
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アノテーション:エンティティクラスに対応するテーブル名を表すために使用されます。
コード:
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と指定します。コード:
@Entity @Table(name = "test_hibernate_mysql")Userクラスを定義します。データベース内の
test_hibernate_mysqlという名前のテーブルとのマッピングに使用されます。idとnameの2つのプロパティを定義します。 アノテーションを使用して、Userクラスのidとnameプロパティとデータベーステーブルの列の対応関係を識別しました。@Idアノテーションを使用してid属性を主キーとして識別し、@GeneratedValueアノテーションを使用して主キーの生成ポリシーをシーケンスと指定し、@Columnアノテーションを使用してプロパティとデータベーステーブルの列のマッピング関係を指定しました。idプロパティはユーザーIDを格納するために使用され、nameプロパティはユーザー名を格納するために使用されます。コード:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "user_id") private int id; @Column(name = "user_name") private String name;Userオブジェクトを作成します。Userクラスの2つのコンストラクタメソッドを定義して、Userオブジェクトを作成するために使用されます。 1つのコンストラクタメソッドはパラメータなしで、Hibernateクエリ操作に使用されます。もう1つのコンストラクタメソッドはパラメータありで、idとnameプロパティを初期化するために使用されます。コード:
public User() { } public User(int id, String name) { this.id = id; this.name = name; }idとnameの値を取得および設定します。Userクラスの4つのメソッドを定義し、idとnameプロパティの値を取得および設定するために使用されます。getIdメソッドはid値を取得するために使用され、setIdメソッドはid値を設定するために使用されます。getNameメソッドは、ユーザー名nameの値を取得するために使用されます。setNameメソッドは、ユーザー名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; }Userオブジェクトの文字列表現を返します。UserクラスのtoStringメソッドをオーバーライドして、Userオブジェクトの文字列表現を返します。@Overrideを定義して、親クラスの同名メソッドをオーバーライドします。toStringメソッドを定義して、Userオブジェクトの文字列表現を返すために使用します。文字列連結を使用して、idとnameプロパティの値を文字列としてフォーマットし、呼び出し元のUserに返します。コード:
@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クラス:I/O例外を処理するために使用されます。Connectionクラス:JDBC接続を取得するために使用されます。SQLExceptionクラス:SQL例外を処理するために使用されます。Listクラス:クエリ結果セットを格納するために使用されます。UUIDクラス:一意の識別子を生成するために使用されます。
コード:
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メソッドを呼び出して、すべてのユーザーデータのクエリを実行します。クエリ結果をイテレーションしてコンソールに出力します。コード:
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 + '\'' +
'}';
}
}
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<User> users = userDao.selectUser();
users.forEach(System.out::println);
}
}
関連ドキュメント
その他のOceanBase Connector/Jの情報については、OceanBase JDBCドライバーを参照してください。
クリックしてjava-oceanbase-hibernateサンプルプロジェクトをダウンロード