本記事では、SpringDataJPAフレームワークとOceanBaseデータベースを使用して、テーブルの作成、データの挿入、クエリなどの基本的な操作を実現するアプリケーションの構築方法を紹介します。
前提条件
- OceanBaseデータベースがインストール済みであること。
- JDK 1.8とMavenがインストール済みであること。
- IntelliJ IDEAがインストール済みであること。
説明
このドキュメントでコードを実行するために使用したツールはIntelliJ IDEA 2021.3.2 (Community Edition)です。個人の好みに応じて、適切なツールを選択してサンプルコードを実行することもできます。
手順
説明
本記事で示す操作手順は、Windows環境に基づいています。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
- OceanBaseデータベースの接続文字列を取得します。
java-oceanbase-springdatajpaプロジェクトをIDEAにインポートします。java-oceanbase-springdatajpaプロジェクトのデータベース接続情報を変更します。java-oceanbase-springdatajpaプロジェクトを実行します。
ステップ1:OceanBaseデータベースの接続文字列を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -hxx.xx.xx.xx -P2883 -uroot@sys#cluster -p**** -Aデプロイ済みのOceanBaseデータベースに基づいて、以下のURLの該当情報を入力します。
説明
application.ymlファイルには、ここのURL情報が必要です。jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$password&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8パラメータ説明:
host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。schema_name:アクセスするスキーマ名です。user_name:-uパラメータで指定し、形式はユーザー@テナント#クラスタ名またはユーザー名@SERVICE:サービス名です。ユーザー@テナント#クラスタ名の形式を使用する場合、デフォルトのテナントはsys、管理者ユーザーはrootです。データベースに直接接続する場合はクラスタ名を省略できますが、ODP接続の場合は入力する必要があります。password:アカウントのパスワードです。characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8:追加の接続プロパティです。characterEncoding:データベースURLオプションでサポートされる文字エンコーディング。デフォルト値はutf8です。useSSL:接続時にSSL/TLSを強制的に使用するかどうか。デフォルト値はfalseです。serverTimezone:サーバーのタイムゾーンを設定します。デフォルト値は中国標準時です。
その他のURLパラメータの詳細については、データベースURLを参照してください。
ステップ2:java-oceanbase-springdatajpa プロジェクトを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-springdatajpa プロジェクトのデータベース接続情報を修正する
ステップ1:OceanBaseデータベースの接続文字列を取得する の情報に基づいて、application.yml ファイル内のデータベース接続情報を修正します。
例:
- データベースドライバーの名前:
com.mysql.cj.jdbc.Driver - OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
testです。 - テナントの接続アカウントは
root@mysql001です。mysql001はOceanBaseデータベースで作成されたMySQLモードのユーザーテナントであり、rootはテナントmysql001のユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.10.10.1:2881/test?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root@mysql001
password: ******
type: com.alibaba.druid.pool.DruidDataSource
ステップ4:java-oceanbase-springdatajpa プロジェクトを実行する
実行パス
- プロジェクト構造の src > test > java から
TestSpringDataJpaApplicationTests.javaファイルを見つけます。 - ツールメニューバーで Run > Run... > TestSpringDataJpaApplicationTests.contextLoads を選択するか、右上の緑色の三角形を直接クリックして実行します。
- IDEAのコンソールでプロジェクトのログ情報と出力結果を確認します。
実行結果
User{id=1, username='insert1'}
User{id=2, username='update'}
User{id=3, username='insert3'}
User{id=4, username='insert4'}
User{id=5, username='insert5'}
プロジェクトコードについて
java-oceanbase-springdatajpa をクリックしてプロジェクトコードをダウンロードします。これは java-oceanbase-springdatajpa という名前の圧縮ファイルです。
解凍すると、java-oceanbase-springdatajpa という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
│--pom.xml
│
├─.idea
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ └─testspringdatajpa
│ │ │ │--TestSpringDataJpaApplication.java
│ │ │ │
│ │ │ ├─dao
│ │ │ │ └─UserRepository.java
│ │ │ │
│ │ │ ├─entity
│ │ │ │ └─User.java
│ │ │ │
│ │ │ └─service
│ │ │ │--UserService.java
│ │ │ │
│ │ │ └─impl
│ │ │ └─--UserServiceImpl.java
│ │ │
│ │ └─resources
│ │ │--application.yml
│ │ │
│ │ ├─static
│ │ └─templates
│ └─test
│ └─java
│ └─com
│ └─oceanbase
│ └─testspringdatajpa
│ └─--TestSpringDataJpaApplicationTests.java
│
└─target
ファイルの説明:
pom.xml:Mavenプロジェクトの設定ファイルで、プロジェクトの依存関係、プラグイン、ビルドなどの情報が含まれます。.idea:IDE(統合開発環境)で使用されるディレクトリで、プロジェクト関連の設定情報を格納します。src:プロジェクトのソースコードを格納するディレクトリです。main: 主要なソースコードとリソースファイルを格納するディレクトリ。java: Javaソースコードを格納するディレクトリ。com: Javaパッケージのルートディレクトリ。oceanbase: プロジェクトのルートディレクトリ。testspringdatajpa:プロジェクトのすべてのJavaクラスを含むJavaパッケージのルートディレクトリ。TestSpringDataJpaApplication.java:Spring Bootアプリケーションのエントリクラス。dao: データアクセスオブジェクト(Data Access Object)パッケージを格納するディレクトリで、データベースやその他のデータストレージサービスへのアクセスに使用されます。UserRepository.java:ユーザーデータアクセスインターフェースで、ユーザーデータの追加、削除、変更、検索操作を定義します。entity:エンティティクラスのディレクトリで、データベーステーブルに対応するJavaクラスを格納します。User.java:ユーザー永続化オブジェクトで、ユーザーデータテーブルのフィールドをマッピングするために使用されます。service:サービスインターフェースのディレクトリで、業務ロジックインターフェースを定義するために使用されます。UserService.java:ユーザーサービスインターフェースで、ユーザーデータの操作メソッドを定義します。impl:サービス実装のディレクトリで、業務ロジックの実装クラスを格納します。UserServiceImpl.java:ユーザーサービスの実装クラスで、UserServiceインターフェースで定義されたメソッドを実装します。resources: リソースファイルを格納するディレクトリで、設定ファイルやSQLファイルなどが含まれます。application.yml:アプリケーションの設定ファイルで、データベース接続などの情報を設定するために使用されます。static:CSSやJavaScriptなどの静的ファイルを格納するディレクトリ。templates:HTMLテンプレートなどのテンプレートファイルを格納するディレクトリ。test: テストコードとリソースファイルを格納するディレクトリ。TestSpringDataJpaApplicationTests.java: Spring Data JPAに関連する機能の実行と検証に使用されるクラス。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ファイルの場所をhttps://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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
親要素情報の設定。
<groupId>を使用して、親要素の識別子をorg.springframework.bootと指定します。<artifactId>を使用して、親要素の依存関係をspring-boot-starter-parentと指定します。<version>を使用して、親要素のバージョン番号を2.7.0と指定します。relativePathを使用して、親要素のパスが空であることを示します。
コード:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/>
</parent>
基本情報の設定。
<groupId>を使用して、プロジェクト識別子をcom.oceanbaseと指定します。<artifactId>を使用して、プロジェクトの依存関係をjava-oceanbase-springdatajpaと指定します。<version>を使用して、プロジェクトのバージョン番号を0.0.1-SNAPSHOTと指定します。descriptionを使用して、プロジェクト情報をDemo project for Spring Bootと紹介します。
コード:
<groupId>com.oceanbase</groupId>
<artifactId>java-oceanbase-springdatajpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>java-oceanbase-springdatajpa</name>
<description>Demo project for Spring Boot</description>
Javaバージョンの設定。
プロジェクトで使用するJavaバージョンを1.8と指定します。
コード:
<properties> <java.version>1.8</java.version> </properties>コア依存関係の設定。
依存関係の所属組織を
org.springframework.boot、名前をspring-boot-starter-data-jpaと指定します。この依存ライブラリには、JPAを使用したデータアクセスに必要な依存関係と設定が含まれています。Spring Boot Starter Data JPAはSpring Bootのスターターです。コード:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>依存関係の所属組織を
org.springframework.boot、名前をspring-boot-starter-webと指定します。この依存ライブラリには、Spring Bootを使用したWeb開発に必要な依存関係と設定が含まれています。これはSpring Bootのスターターです。コード:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>依存関係の所属組織を
org.springframework.boot、名前をspring-boot-starter-test、作用範囲をtestと指定します。この依存関係により、JUnit、Mockito、Hamcrestなど、Spring Bootが提供するテストフレームワークとツールを使用できます。コード:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>依存関係の所属組織を
com.alibaba、名前をdruid、バージョン番号を1.2.8と指定します。この依存関係により、Druidライブラリを使用して、データベース接続の取得と解放を管理・最適化できます。
**コード:**
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
```
- 依存関係の所属組織を
com.oceanbase、名前をoceanbase-client、バージョン番号を2.4.2と指定します。この依存関係により、OceanBaseが提供するクライアント機能(接続、クエリ、トランザクションなど)を使用できます。
**コード:**
```xml
<dependencies>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
```
- Mavenプラグインの設定。
依存関係の所属組織を org.springframework.boot、名前を spring-boot-maven-plugin と指定します。このプラグインは、Spring Bootアプリケーションを実行可能なJARパッケージまたはWARパッケージにパッケージ化し、直接実行するために使用されます。他のプラグインやツールとの競合を避けるため、ビルドプロセスでLombok依存関係を追加します。
コード:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
application.ymlコードの紹介
application.yml ファイルは、Spring Bootアプリケーションの設定ファイルであり、いくつかの重要なパラメータが含まれています。このファイルでは、アプリケーションのコンテキストパス、リスニングポート番号、データベース接続情報、およびJPA関連のプロパティを設定します。
application.yml ファイルのコードは、主に以下の部分で構成されています:
Serverパートservlet:Servlet関連のプロパティを設定します。context-path:アプリケーションのコンテキストパスをtestspringdatajpaと指定します。port:アプリケーションがリスニングするポート番号を8890と指定します。
コード:
server: servlet: context-path: /testspringdatajpa port: 8890Springパートdatasource:データソース関連のプロパティ、すなわちデータベース接続情報を設定します。driver-class-name:データベースドライバーのクラス名をcom.mysql.cj.jdbc.Driverと指定します。url:データベースの接続URLを指定します。これには、データベースのアドレス、ポート番号、データベース名などの情報が含まれます。username:データベースに接続するためのユーザー名を指定します。password:データベースに接続するためのパスワードを指定します。type:データソースとしてDruid接続プールを使用することを指定します。
コード:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://host:port/schema_name?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username: user_name password: ****** type: com.alibaba.druid.pool.DruidDataSourceJPAパートhibernate:Hibernate関連のプロパティを設定します。ddl-auto:Hibernateが起動時にデータベース構造を自動更新するモードをupdateと指定します。show-sql:コンソールにSQLステートメントを出力するかどうかを指定します。値はtrueです。format-sql:出力されるSQLステートメントをフォーマットするかどうかを指定します。値はtrueです。
open-in-view:Open-in-Viewモードを有効にするかどうかを指定します。値はfalseです。
コード:
jpa: hibernate: ddl-auto: update show-sql: true format-sql: true open-in-view: false
userRepository.javaファイルの紹介
userRepository.java ファイルは、DAOインターフェースを通じてユーザーエンティティ(User)に対するデータベース操作メソッドを定義するために使用されます。SQLステートメントとHQLステートメントを使用したカスタムの更新およびクエリメソッドが含まれています。
userRepository.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。
このファイルには以下のインターフェースとクラスが含まれていることを宣言します:
Userクラス:サービスクラスでユーザーオブジェクトを操作および処理するために使用されます。JpaRepositoryインターフェース:このインターフェースを継承して基本的なCRUD操作メソッドを取得するために使用されます。Modifyingアノテーション:変更操作を行うメソッドをマークするために使用されます。Queryアノテーション:カスタムクエリメソッドを定義するために使用されます。Paramアノテーション:メソッドパラメータをクエリステートメント内のパラメータにマッピングするために使用されます。Repositoryアノテーション:DAOインターフェースをSpringのリポジトリコンポーネントとしてマークするために使用されます。
コード:
import com.oceanbase.testspringdatajpa.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;UserRepositoryインターフェースの定義。UserRepositoryインターフェースは、ユーザーデータへのアクセスに使用されます。SpringのRepositoryコンポーネントとしてマークされ、beanの名前をuserRepositoryと指定します。@Queryアノテーションを使用してSQLステートメントを指定し、nativeQuery = trueを使用してネイティブSQLステートメントを使用します。@Modifyingアノテーションを使用してカスタムの更新メソッドを定義し、ネイティブSQLステートメントを使用して更新操作を行います。@Queryアノテーションを使用してHQL(Hibernate Query Language)ステートメントを指定し、@Paramアノテーションを使用してメソッドパラメータをHQLステートメント内のパラメータにマッピングします。
コード:
@Repository("userRepository") public interface UserRepository extends JpaRepository<User, Integer> { @Query(value = "update test_springdatajpa_2 set username=?1 where id=?2", nativeQuery = true) @Modifying int updateById(String name, String id); @Query("SELECT u FROM User u WHERE u.username = :username") User findUser(@Param("username") String username); }
User.javaファイルの紹介
User.java ファイルは、ユーザーオブジェクトを表すUserクラスを定義します。
User.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスのインポート。
javax.persistence.*:javax.persistenceパッケージ内のすべてのクラスをインポートするために使用されます。javax.persistenceはJava Persistence API(JPA)の標準パッケージであり、オブジェクト関係マッピング(ORM)を行うための一連のインターフェースとアノテーションを提供します。コード:
import javax.persistence.*;Userオブジェクトの定義。 JPAアノテーションを使用して、エンティティクラスとテーブルのマッピング関係を識別します。これには、テーブル名、主キー、フィールド名などが含まれます。@Entityアノテーションを使用してこのクラスをエンティティクラスとしてマークし、@Tableアノテーションで対応するデータベーステーブル名を指定します。@Idアノテーションでエンティティクラスの主キーをマークし、@GeneratedValueアノテーションで主キーの生成戦略を指定します。@Columnアノテーションは、フィールド名と制約条件を指定するために使用されます。このクラスにはidとusernameの2つの属性があり、それぞれユーザーの一意の識別子とユーザー名を表します。また、空のUserオブジェクトを作成するためのデフォルトコンストラクタも提供されています。コード:
@Entity @Table(name = "test_springdatajpa_2") public class User { @Id @GeneratedValue(strategy = GenerationType.TABLE) @Column(name = "id", nullable = false) private Integer id; @Column(name = "username") private String username; public User() { } }idとnameの値の取得と設定。 このエンティティクラスには、パラメータ付きコンストラクタが提供されており、エンティティクラスのオブジェクトを作成してidとusername属性を初期化するために使用されます。idとname属性の値を取得および設定するための4つのメソッドが定義されています。getIdメソッドはid値を取得するために使用されます。setIdメソッドはid値を設定するために使用されます。getNameメソッドは、ユーザー名nameの値を取得するために使用されます。setNameメソッドは、ユーザー名nameの値を設定するために使用されます。
コード:
public User(Integer id, String username) { this.id = id; this.username = username; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }Userオブジェクトの文字列表現を返す。UserクラスのtoStringメソッドをオーバーライドして、Userオブジェクトの文字列表現を返すために使用します。@Overrideを定義して、親クラスの同名メソッドをオーバーライドします。toStringメソッドを定義して、Userオブジェクトの文字列表現を返すために使用します。文字列連結を使用して、idとname属性の値を文字列としてフォーマットし、呼び出し元のUserに返します。コード:
@Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; }
UserServiceImpl.javaファイルの紹介
UserServiceImpl.java ファイルは、JPAを使用してデータベースを操作し、ユーザーデータの追加、削除、更新、検索を行います。
UserServiceImpl.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。
このファイルには以下のインターフェースとクラスが含まれていることを宣言します:
UserRepositoryクラス:サービスクラスでデータアクセスオブジェクト(DAO)に定義されたメソッドを注入および呼び出すために使用されます。Userクラス:サービスクラスでユーザーオブジェクトを操作および処理するために使用されます。UserServiceクラス:他のクラスでサービスクラスに定義されたメソッドを注入および呼び出すために使用されます。Autowiredアノテーション:依存オブジェクトの自動注入に使用されます。Pageクラス:ページネーション検索結果のカプセル化に使用されます。PageRequestクラス:ページネーションリクエストオブジェクトの作成に使用されます。Pageableインターフェース:ページネーションリクエストを定義するためのインターフェースです。Sortクラス:ソート規則を定義するために使用されます。Serviceアノテーション:クラスをサービスクラスとしてマークするために使用されます。Transactionalアノテーション:トランザクションメソッドをマークするために使用されます。Iteratorクラス:コレクションを走査するために使用されます。Optionalクラス:nullの可能性のあるオブジェクトを処理するために使用されます。
コード:
import com.oceanbase.testspringdatajpa.dao.UserRepository; import com.oceanbase.testspringdatajpa.entity.User; import com.oceanbase.testspringdatajpa.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Iterator; import java.util.Optional;UserServiceImplクラスは、UserServiceインターフェースで宣言されたメソッドを実装しています。UserRepositoryの依存性注入により、データベースへのアクセスを実現します。ユーザーデータの挿入、削除、更新、検索のメソッドを具体的に実装し、ページネーション検索をサポートしています。@Transactionalアノテーションを使用してトランザクションサポートを有効にし、データベース操作がトランザクション内で実行されることを保証します。UserRepositoryプロパティの構築。 プライベートなUserRepositoryプロパティを定義し、コンストラクタに@Autowiredアノテーションを使用して依存性注入を行います。コンストラクタでUserRepository依存関係を注入し、userRepositoryプロパティを使用してユーザーデータにアクセスおよび操作します。コード:
private final UserRepository userRepository; @Autowired public UserServiceImpl(UserRepository userRepository) { this.userRepository = userRepository; }ユーザーデータの挿入。
insertUserメソッドはUserオブジェクトをパラメータとして受け取り、UserRepositoryのsaveメソッドを呼び出して、ユーザーオブジェクトをデータベースに保存します。コード:
@Override public void insertUser(User user) { userRepository.save(user); }ユーザーデータの削除。
deleteUserメソッドでは、UserRepositoryのexistsByIdメソッドを呼び出して、指定されたidのユーザーが存在するかどうかを判断します。存在する場合は削除操作を行い、存在しない場合は直接返します。コード:
@Override public void deleteUser(Integer id) { if (!userRepository.existsById(id)) { return; } }ユーザーデータの更新。
updateUserメソッドでは、UserRepositoryのsaveメソッドを呼び出して、ユーザーオブジェクトをデータベースに保存し、更新操作を実装します。同時に、更新操作が成功したことを示す整数値1を返します。 また、ユーザー名とidに基づいてユーザーデータを更新するメソッドもあります。UserRepositoryのupdateByIdメソッドを呼び出して更新操作を実装し、更新結果を返します。コード:
@Override public int updateUser(User user) { userRepository.save(user); return 1; } //update based on name and id @Override public int updateUserById(String name, String id) { return userRepository.updateById(name, id); }ユーザーデータの検索。
IDに基づいてユーザーデータを検索します。selectUserByIdメソッドでは、UserRepositoryのfindByIdメソッドを呼び出してユーザーデータを検索し、結果をOptionalオブジェクトにカプセル化します。次に、OptionalのorElseメソッドを呼び出してOptionalオブジェクト内の値を取得し、user変数に代入します。最後に、検索したユーザーオブジェクトを返します。- ユーザー名に基づいてユーザーデータを検索します。
selectUserByNameメソッドでは、UserRepositoryのfindUserメソッドを呼び出して、ユーザー名に基づいてユーザーデータを検索し、検索したユーザーオブジェクトを直接返します。
コード:
@Override public User selectUserById(Integer id) { Optional<User> optional = userRepository.findById(id); User user = optional.orElse(null); return user; } @Override public User selectUserByName(String username) { return userRepository.findUser(username); }すべてのユーザーデータをページネーション検索します。
selectUserAllメソッドでは、Sortオブジェクトを作成してソート規則を指定し、Pageableオブジェクトを作成してページネーションパラメータを指定します。UserRepositoryのfindAllメソッドを呼び出してユーザーデータを検索し、Pageオブジェクトを返します。次に、Pageオブジェクトのiteratorメソッドを呼び出して、ユーザーデータのイテレータを取得します。最後に、ユーザーデータのイテレータを返します。コード:
@Override public Iterator<User> selectUserAll(Integer pageNum, Integer pageSize) { Sort sort = Sort.by(Sort.Direction.ASC, "id"); Pageable pageable = PageRequest.of(pageNum, pageSize, sort); Page<User> users = userRepository.findAll(pageable); Iterator<User> userIterator = users.iterator(); return userIterator; }
UserService.javaファイルの紹介
UserService.java ファイルは、JPAを使用してデータベースを操作し、ユーザーデータの追加、削除、更新、検索を行います。
UserService.java ファイルのコードには、主に以下の部分が含まれます:
他のクラスとインターフェースのインポート。
このファイルには以下のクラスが含まれていることを宣言します:
Userクラス:サービスクラスでユーザーオブジェクトを操作および処理するために使用されます。Iteratorクラス:コレクションを走査するために使用されます。
コード:
import com.oceanbase.testspringdatajpa.entity.User; import java.util.Iterator;UserServiceインターフェースの定義。UserServiceインターフェースを通じて、ユーザーデータの挿入、削除、更新、検索を行うメソッドを定義します。以下のメソッドとクラスが含まれます:insertUserメソッド:ユーザーデータを挿入するために使用されます。deleteUserメソッド:ユーザーデータを削除するために使用されます。updateUserメソッド:ユーザーデータを更新するために使用されます。updateUserByIdメソッド:idに基づいてユーザーのnameを変更するために使用されます。selectUserByIdメソッド:idに基づいてユーザーデータを検索するために使用されます。selectUserByNameメソッド:ユーザー名に基づいてユーザーデータを検索するために使用されます。selectUserAllメソッド:すべてのユーザーデータをページング検索するために使用されます。Userクラス:サービスクラスでユーザーオブジェクトを操作および処理するために使用されます。Iteratorクラス:コレクションを走査するために使用されます。
コード:
public interface UserService { void insertUser(User user); void deleteUser(Integer id); int updateUser(User user); int updateUserById(String name, String id); User selectUserById(Integer id); User selectUserByName(String username); Iterator<User> selectUserAll(Integer pageNum, Integer pageSize); }
TestSpringDataJpaApplication.javaファイルの紹介
TestSpringDataJpaApplication.java ファイルは、Spring Bootアプリケーションの起動と設定に使用されます。
TestSpringDataJpaApplication.java ファイルのコードには、主に以下の部分が含まれます:
クラスとインターフェースの定義。 このファイルには以下のクラスが含まれていることを宣言します:
SpringApplicationクラス:Spring Bootアプリケーションを起動するために使用されます。@SpringBootApplicationアノテーション:Spring Bootアプリケーションのエントリクラスをマークするために使用されます。
コード:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;TestSpringDataJpaApplicationクラスの定義。@SpringBootApplicationアノテーションを使用してSpring Bootアプリケーションのエントリクラスをマークし、mainメソッド内でSpringApplication.runメソッドを呼び出してアプリケーションを起動します。コード:
@SpringBootApplication public class TestSpringDataJpaApplication { public static void main(String[] args) { SpringApplication.run(TestSpringDataJpaApplication.class, args); } }
TestSpringDataJpaApplicationTests.javaファイルの紹介
TestSpringDataJpaApplicationTests.java ファイルは、Spring Bootアプリケーションを起動および設定するために使用されます。
TestSpringDataJpaApplicationTests.java ファイルのコードは、主に以下の部分で構成されています:
他のクラスとインターフェースのインポート。 このファイルには以下のクラスが含まれていることを宣言します:
Userクラス:サービスクラスでユーザーオブジェクトを操作および処理するために使用されます。UserServiceクラス:他のクラスで注入し、サービスクラスで定義されたメソッドを呼び出すために使用されます。@Testアノテーション:テストメソッドをマークするために使用されます。Autowiredアノテーション:依存オブジェクトを自動注入するために使用されます。@SpringBootTestアノテーション:Spring Bootアプリケーションをテストするために使用されます。Iteratorクラス:コレクションを走査するために使用されます。
コード:
import com.oceanbase.testspringdatajpa.entity.User; import com.oceanbase.testspringdatajpa.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Iterator;UserServiceメソッドの定義。 Spring Bootアプリケーション内のUserServiceサービスの各メソッドをテストするために使用されます。UserService依存関係を注入し、各メソッドを呼び出してユーザーデータの挿入、削除、更新、およびクエリ機能をテストし、関連する結果を出力します。@Autowiredアノテーションを使用します。UserServiceインターフェースの実装クラスをuserService変数に自動注入します。コード:
@Autowired private UserService userService;contextLoadsメソッドを使用したテスト。ユーザーデータの挿入。
forループを使用して、userServiceのinsertUserメソッドを呼び出し、10件のユーザーデータを挿入します。コード:
for (int i = 1; i <= 10; i++) { userService.insertUser(new User(i, "insert" + i)); }ユーザーデータの削除。
userServiceのdeleteUserメソッドを呼び出し、idが1のユーザーデータを削除します。コード:
userService.deleteUser(1);ユーザーデータの更新。
userServiceのupdateUserメソッドを呼び出し、idが2のユーザーデータを更新します。コード:
userService.updateUser(new User(2, "update"));ユーザーデータのクエリ。
userServiceのselectUserByIdメソッドを呼び出し、idに基づいてユーザーデータをクエリし、結果をuser変数に代入します。userオブジェクトを出力します。userServiceのselectUserByNameメソッドを呼び出し、ユーザー名に基づいてユーザーデータをクエリし、結果をuserByName変数に代入します。userByNameオブジェクトを出力します。
コード:
User user = userService.selectUserById(2); System.out.println("user = " + user); User userByName = userService.selectUserByName("insert"); System.out.println("userByName = " + userByName);ユーザーデータのページネーションクエリ。
userServiceのselectUserAllメソッドを呼び出し、すべてのユーザーデータをページネーションクエリし、結果をuserIterator変数に代入します。forEachRemainingメソッドを使用してuserIteratorを走査し、各ユーザーオブジェクトを出力します。コード:
Iterator<User> userIterator = userService.selectUserAll(0, 5); userIterator.forEachRemaining(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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.oceanbase</groupId>
<artifactId>java-oceanbase-springdatajpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>java-oceanbase-springdatajpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
server:
servlet:
context-path: /testspringdatajpa
port: 8890
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:oceanbase://host:port/schema_name?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: user_name
password: ******
type: com.alibaba.druid.pool.DruidDataSource
jpa:
hibernate:
ddl-auto: update
show-sql: true
format-sql: true
open-in-view: false
package com.oceanbase.testspringdatajpa.dao;
import com.oceanbase.testspringdatajpa.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository("userRepository")
public interface UserRepository extends JpaRepository<User, Integer> {
//Custom repository handwritten SQL, placeholder value transfer form
@Query(value = "update test_springdatajpa_2 set username=?1 where id=?2", nativeQuery = true)
@Modifying
int updateById(String name, String id);
//SPEL expression, hql syntax
@Query("SELECT u FROM User u WHERE u.username = :username")
User findUser(@Param("username") String username);//Mapping parameter username to database field username
}
package com.oceanbase.testspringdatajpa.entity;
import javax.persistence.*;
@Entity
@Table(name = "test_springdatajpa_2")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "username")
private String username;
public User() {
}
public User(Integer id, String username) {
this.id = id;
this.username = username;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
package com.oceanbase.testspringdatajpa.service.impl;
import com.oceanbase.testspringdatajpa.dao.UserRepository;
import com.oceanbase.testspringdatajpa.entity.User;
import com.oceanbase.testspringdatajpa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import java.util.Optional;
@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
//insert
@Override
public void insertUser(User user) { userRepository.save(user); }
//delete
@Override
public void deleteUser(Integer id) {
if (!userRepository.existsById(id)) {
return;
}
}
//update
@Override
public int updateUser(User user) {
userRepository.save(user);
return 1;
}
//update based on name and id
@Override
public int updateUserById(String name, String id) {
return userRepository.updateById(name, id);
}
// select one user
@Override
public User selectUserById(Integer id) {
Optional<User> optional = userRepository.findById(id);
User user = optional.orElse(null);
return user;
}
//query user based on username
@Override
public User selectUserByName(String username) {
return userRepository.findUser(username);
}
@Override
public Iterator<User> selectUserAll(Integer pageNum, Integer pageSize) {
//By passing parameters to this method, physical pagination can be achieved, which is very simple.
Sort sort = Sort.by(Sort.Direction.ASC, "id");
Pageable pageable = PageRequest.of(pageNum, pageSize, sort);
Page<User> users = userRepository.findAll(pageable);
Iterator<User> userIterator = users.iterator();
return userIterator;
}
}
package com.oceanbase.testspringdatajpa.service;
import com.oceanbase.testspringdatajpa.entity.User;
import java.util.Iterator;
public interface UserService {
//insert
void insertUser(User user);
//delete
void deleteUser(Integer id);
//update
int updateUser(User user);
//customize SQL and modify name based on id
int updateUserById(String name, String id);
//select one user
User selectUserById(Integer id);
//customize SQL to query users based on username
User selectUserByName(String username);
//query all users
Iterator<User> selectUserAll(Integer pageNum, Integer pageSize);
}
package com.oceanbase.testspringdatajpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TestSpringDataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(TestSpringDataJpaApplication.class, args);
}
}
package com.oceanbase.testspringdatajpa;
import com.oceanbase.testspringdatajpa.entity.User;
import com.oceanbase.testspringdatajpa.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Iterator;
@SpringBootTest
class TestSpringDataJpaApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
//insert
for (int i = 1; i <= 10; i++) {
userService.insertUser(new User(i, "insert" + i));
}
//delete
userService.deleteUser(1);
//update
userService.updateUser(new User(2, "update"));
//selectUserById
User user = userService.selectUserById(2);
System.out.println("user = " + user);
//selectUserByName
User userByName = userService.selectUserByName("insert");
System.out.println("userByName = " + userByName);
//query all users
Iterator<User> userIterator = userService.selectUserAll(0, 5);
userIterator.forEachRemaining(System.out::println);
}
}
関連ドキュメント
OceanBase Connector/Jの詳細については、OceanBase JDBCドライバを参照してください。
クリックしてjava-oceanbase-springdatajpaサンプルプロジェクトをダウンロード