⇧ amazing...
Oracle DatabaseのPDB(Pluggable DataBase)とは
Oracleのドキュメントによりますと、
CDBは、顧客が作成した0以上のプラガブル・データベース(PDB)を含みます。PDBは、Oracle Netクライアントに非CDBとして表示されるスキーマ、スキーマ・オブジェクトおよび非スキーマ・オブジェクトの移植可能な集合です。Oracle Database 12cまでのOracle Databaseはすべて非CDBでした。
⇧ とあり、Oracle Database 12cで取り入れられた概念らしい。
そして、
Oracle Database 20cから、マルチテナント・コンテナ・データベースがサポート対象の唯一のアーキテクチャになりました。前のリリースでは、Oracleは非コンテナ・データベース(非CDB)をサポートしていました。
⇧ Oracle Database 20cからは、マルチテナント・コンテナ・データベースのみの対応となったようです。
⇧ PDB(Pluggable DataBase)は、CDBに付属する形になってますと。
Spring BootでOracle DatabaseのPDB(Pluggable DataBase)に接続
で、ネットの情報を見てると、CDBとPDB(Pluggable DataBase)のどっちに接続するかを明示していない情報が多いんだけども、
⇧ 上記サイト様によりますと、PDB(Pluggable DataBase)に接続ということで良いようです。
ちなみに、今回、利用するのは、Oracle Database 19cになります。
⇧ 上記の記事で作成していたテーブルを利用していきます。
とりあえず、テーブルにデータを入れておきます。
ちなみに、Oracleさん何を血迷ったか、
注意点ですが、名前から日付のみを格納する型だと思われがちですが、時刻まで格納することができます。
⇧ ということで、中々の鬼畜仕様。Oracle Databaseを使う場合、生年月日にDate型を使わない方が良さそう、今回はDate型にしちゃってますが...。
■USERSテーブル
INSERT ALL INTO USERS (user_id, insert_user, insert_date) VALUES (1, 'admin', CURRENT_TIMESTAMP) INTO USERS (user_id, insert_user, insert_date) VALUES (2, 'admin', CURRENT_TIMESTAMP) INTO USERS (user_id, insert_user, insert_date) VALUES (3, 'admin', CURRENT_TIMESTAMP) SELECT * FROM DUAL;
■USER_DETAILテーブル
INSERT ALL INTO USER_DETAIL (user_id, last_name, first_name, gender, birthday, insert_user, insert_date, delete_flg) VALUES (1, '鈴木', '一郎', 'man', '1983-1-1', 'admin', CURRENT_TIMESTAMP, '0') INTO USER_DETAIL (user_id, last_name, first_name, gender, birthday, insert_user, insert_date, delete_flg) VALUES (2, '佐藤', '二郎', 'man', '1982-2-1', 'admin', CURRENT_TIMESTAMP, '0') INTO USER_DETAIL (user_id, last_name, first_name, gender, birthday, insert_user, insert_date, delete_flg) VALUES (3, '高橋', '三郎', 'man', '1981-3-1', 'admin', CURRENT_TIMESTAMP, '0') SELECT * FROM DUAL;
⇧ データが登録されました。
そしたらば、Eclipseを起動して、「ファイル(F)」>「新規(N)」>「Spring スターター・プロジェクト(Spring Initializr)」を選択。
ビルドツールは、Gradleにしたいので、「タイプ:」は「Gradle-Groovy」で。
依存関係を追加で。
依存関係ですが、
■/oracle-db-example/build.gradle
plugins { id 'java' id 'org.springframework.boot' version '2.7.5' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.oracle.database.jdbc:ojdbc11' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
⇧ oracle driverのバージョンを8から11に変えてます。
ちなみに、Oracle Databaseの場合、JDBCのURLの書き方が何種類かあるらしく、
⇧ 上記サイト様が詳しいです。
自分の場合、Oracle Database 12cと19cの2つインストールしてるせいか、リスナー名まで指定しないと情報が取得できなかったのですが、
⇧ サービス名を確認できますと。
Oracleのドキュメントによりますと、
Thin-style service names are supported only by the JDBC Thin driver. The syntax is:
@//host_name:port_number/service_name
For example:
jdbc:oracle:thin:scott/tiger@//myhost:1521/myservicename
https://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA
⇧ サービス名を使う場合のURLは上記のようにするらしいですと。
というわけで、自分の環境ではポート番号とかも変えてるので、データベースの接続設定は以下のような感じになってます。
■/oracle-db-example/src/main/resources/application.properties
# DB接続情報 spring.datasource.url=jdbc:oracle:thin:@//localhost:1519/orcldb_19c spring.datasource.username=ts0818 spring.datasource.password=password spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
そしたらば、必要なクラスを作成していきます。
■/oracle-db-example/src/main/java/com/example/demo/entity/UserDetail.java
package com.example.demo.entity; import java.time.LocalDate; import java.time.OffsetDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; @Data @Entity @Table(name="user_detail") public class UserDetail { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="user_id") private String userId; @Column(name="last_name") private String lastName; @Column(name="first_name") private String firstName; @Column(name="gender") private String gender; @Column(name="birthday") private LocalDate birthday; @Column(name="address_id") private String addressId; @Column(name="insert_user") private String insertUser; @Column(name="insert_date") private OffsetDateTime insertDate; @Column(name="update_user") private String updateUser; @Column(name="update_date") private OffsetDateTime updateDate; @Column(name="delete_flg") private Character deleteFlg; @Column(name="delete_date") private OffsetDateTime deleteDate; }
■/oracle-db-example/src/main/java/com/example/demo/repository/UserDetailRepository.java
package com.example.demo.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.entity.UserDetail; public interface UserDetailRepository extends JpaRepository<UserDetail, String> { }
■/oracle-db-example/src/main/java/com/example/demo/service/UserDetailServiceImpl.java
package com.example.demo.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.entity.UserDetail; import com.example.demo.repository.UserDetailRepository; @Service public class UserDetailServiceImpl { @Autowired private UserDetailRepository userDetailRepository; public List<UserDetail> findAll() { return userDetailRepository.findAll(); } }
■/oracle-db-example/src/main/java/com/example/demo/rest_controller/UserDetailController.java
package com.example.demo.rest_controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.entity.UserDetail; import com.example.demo.service.UserDetailServiceImpl; @RestController public class UserDetailController { @Autowired private UserDetailServiceImpl userDetailServiceImpl; @GetMapping("find-all") public List<UserDetail> findAll() { return userDetailServiceImpl.findAll(); } }
で、実行して、
ブラウザから、@RestControllerのメソッドのエンドポイントにアクセス。
Oracle DatabaseのPDB(Pluggable DataBase)に接続して、PDB(Pluggable DataBase)のテーブルから情報が取得できました。
Oracleのドキュメントに掲載されてるデータベースの接続情報が結構、適当なので何を信じて良いかがハッキリしない....
毎度モヤモヤ感が半端ない...
今回はこのへんで。