本記事では、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:テナントの接続アカウント。ODP接続方式の一般的な形式には次の2種類があります:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。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.oceanbase.jdbc.Driver - OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
sysです。 - テナントの接続アカウントは
sys@xyoracleです。xyoracleはOceanBaseデータベース内に作成されたOracleモードのユーザーテナントであり、sysはテナントxyoracleのユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
spring:
datasource:
driver-class-name: com.oceanbase.jdbc.Driver
url: jdbc:oceanbase://10.10.10.1:2881/sys?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: sys@xyoracle
password:******
type: com.alibaba.druid.pool.DruidDataSource
ステップ4:java-oceanbase-springdatajpa プロジェクトを実行する
実行パス
- プロジェクト構造の src > test > java フォルダから
TestSpringDataJpaApplicationTests.javaファイルを見つけます。 - ツールメニューバーで Run > Run... > TestSpringDataJpaApplicationTests.contextLoads を選択するか、右上の緑色の三角形をクリックして直接実行します。
- IDEAのコンソールを使用して、プロジェクトのログ情報と出力結果を確認します。
実行結果
User{id=4, username='insert4'}
User{id=5, username='insert5'}
User{id=6, username='insert6'}
User{id=7, username='insert7'}
User{id=8, username='insert8'}
プロジェクトコードについて
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ライブラリを使用して、データベース接続の取得と解放を管理・最適化できます。コード:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>依存関係が所属する組織を
com.oceanbase、名前をoceanbase-client、バージョン番号を2.4.3と指定します。この依存関係により、OceanBaseが提供するクライアント機能(接続、クエリ、トランザクションなど)を使用できます。コード:
<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.oceanbase.jdbc.Driverと指定します。url:データベースの接続URLを指定します。データベースのアドレス、ポート番号、データベース名などの情報が含まれます。username:データベースに接続するためのユーザー名を指定します。password:データベースに接続するためのパスワードを指定します。type:データソースとしてDruid接続プールを使用することを指定します。
コード:
spring: datasource: driver-class-name: com.oceanbase.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.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プロパティを初期化するためのパラメータ付きコンストラクタを提供します。 4つのメソッドが定義されており、idとnameプロパティの値を取得および設定するために使用されます。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クラス:空である可能性のあるオブジェクトを処理するために使用されます。
コード:
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.oceanbase.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サンプルプロジェクトをダウンロード