Spring BootのWEBアプリケーションを開発する際、なんらかのデータベースにアクセスすることが多いが、SpringのJPAライブラリを利用すると、少ないコード量でDBアクセス処理の記述を行うことができる。
ただし、データベースアクセスが行えるようにするには、Oracle JDBCに接続するjarファイルの追加や、build.gradleの設定変更も必要になってくる。
今回は、最もよく使われているOracleデータベースからデータを取得し、その結果を表示するサンプルプログラムを作成してみたので、共有する。
前提条件
以下の記事のSpring BootのWEB画面用アプリが作成済であること。
また、以下の記事のlombokの設定が完了していること。
やってみたこと
Oracle XEのインストール
「Oracle XE」を利用すると、無料でOracleのデータベースを利用できるので、Oracle XEのインストールを行った。
Oracle XEのインストール手順は、以下を参照のこと。ただし、最新の18cをインストールしようとしたところ失敗してしまったので、今回は、以前のバージョンの「Oracle Database Express Edition 11g Release 2」をインストールした。
接続用テーブルの作成とデータ追加
今回作成するサンプルプログラムがアクセスするテーブル「user_data」を作成した。実行したSQLは以下の通り。
1 2 3 4 5 6 7 8 | create table user_data ( id number(6) primary key not null, name varchar2(40) not null, birth_year number(4) not null, birth_month number(2) not null, birth_day number(2) not null, sex char(1) not null ); |
1 2 3 | insert into user_data values (1, 'テスト プリン', 2012, 2, 28, '2'); insert into user_data values (2, 'テスト プリン2', 2013, 3, 19, '1'); commit; |
Oracle JDBC接続用jarの配置
Oracle JDBCに接続するjarファイルは、Oracle XEをインストール後の以下の場所に配置されている。
上記のうちの「ojdbc6.jar」を、サンプルプログラムのdemoプロジェクト下、libフォルダ下に配置する。今回作成したサンプルプログラムの構成は以下の通りで、「ojdbc6.jar」は下図上方のlibフォルダ内を参照のこと。
build.gradleにOracle接続用定義を追加
今回のサンプルプログラムでは、Oracle接続用jarとJPAライブラリが必要になるので、build.gradleに「spring-boot-starter-data-jpa」と「ojdbc6.jar」の定義を追加する。
追加後の「build.gradle」は以下の通りで、下2行がOracle接続用jarとJPAライブラリの定義となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compile files('lib/ojdbc6.jar') } |
その他、今回もlombokが必要になるので、その定義も追加している。lombokについては以下のサイトを参照のこと。
サンプルプログラムの作成と実行
作成したサンプルプログラムの構成は、「Oracle JDBC接続用jarの配置」に記載した通りとなる。
まず、Oracleに接続するための接続情報を、application.propertiesに追加した。追加したプロパティファイルの内容は以下の通り。
1 2 3 4 5 6 | server.port = 8084 # DB接続情報 spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe spring.datasource.username=USER01 spring.datasource.password=USER01 spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver |
次に、Oracleに接続する際にJPAを利用するため、テーブル「user_data」アクセス用エンティティクラスと、JPAアクセス用リポジトリを作成した。そのプログラムの内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package com.example.demo; import lombok.Data; import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; /** * ユーザーデータテーブル(user_data)アクセス用エンティティ */ //テーブル名を「@Table」アノテーションで指定 //「@Data」アノテーションを付与すると、このクラス内の全フィールドに対する //Getterメソッド・Setterメソッドにアクセスができる @Entity @Table(name="user_data") @Data public class UserData { /** ID */ //主キー項目に「@Id」を付与し、その値を自動生成するにはアノテーション //「@GeneratedValue(strategy = GenerationType.AUTO)」を付与する @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; /** 名前 */ private String name; /** 生年月日_年 */ //カラム名を「@Column」アノテーションで指定 @Column(name="birth_year") private int birthY; /** 生年月日_月 */ @Column(name="birth_month") private int birthM; /** 生年月日_日 */ @Column(name="birth_day") private int birthD; /** 性別 */ private String sex; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.example.demo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * ユーザーデータテーブル(user_data)アクセス用リポジトリ */ // JpaRepositoryクラスを継承することによって、ユーザーデータテーブル(user_data)への // select, insert, delete, updateを行うメソッドを自動で生成してくれる @Repository public interface UserDataRepository extends JpaRepository<UserData, Long> { } |
エンティティクラスでは、クラスに「@Entity」アノテーションを付与することと、主キー項目に「@Id」アノテーションを付与することが必須である。また、リポジトリは、JpaRepositoryインタフェースを継承する必要がある。
また、JPAアクセス用リポジトリの呼出は、コントローラクラスで行っている。そのプログラムの内容は以下の通り。ここでは、初期表示時にユーザーデータテーブルの全データを取得し、userDataListに格納できるよう、UserDataRepositoryクラスのfindAllメソッドを呼び出している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @Controller public class DemoController { /** * ユーザーデータテーブル(user_data)へアクセスするリポジトリ */ @Autowired private UserDataRepository repository; /** * ユーザーデータテーブル(user_data)の全データを取得して返却する * @return ユーザーデータリスト */ @ModelAttribute("userDataList") public List<UserData> userDataList(){ return repository.findAll(); } /** * 初期表示画面に遷移する * @return 初期表示画面へのパス */ @RequestMapping("/") public String index(){ return "index"; } } |
また、ユーザーデータテーブルから取得した結果を表示するHTMLファイルの内容は、以下の通り。ここでは、userDataListの値を一覧で表示するために、th:eachタグを利用している。また、それぞれのデータを表示するために、th:textタグを利用している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>index page</title> </head> <body> ユーザーデータテーブル(user_data)の全データ<br/><br/> <table border="1" cellpadding="5"> <tr> <th>ID</th> <th>name</th> <th>birthYear</th> <th>birthMonth</th> <th>birthDay</th> <th>sex</th> </tr> <tr th:each="obj : ${userDataList}"> <td th:text="${obj.id}"></td> <td th:text="${obj.name}"></td> <td th:text="${obj.birthY}"></td> <td th:text="${obj.birthM}"></td> <td th:text="${obj.birthD}"></td> <td th:text="${obj.sex}"></td> </tr> </table> </body> </html> |
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-oracle/demo
作成したサンプルプログラムを実行した結果は以下の通りで、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、ユーザーデータテーブル(user_data)のデータが画面上に表示されることが確認できる。
要点まとめ
- Spring BootのアプリケーションでOracle接続を行うためには、build.gradleに、「spring-boot-starter-data-jpa」と「ojdbcXX.jar」の定義を追加する。
- Oracle接続用の定義は、「application.properties」に追加する。
- Oracleに接続する際にJPAを利用できるようにするには、テーブルにアクセスするエンティティクラスと、JPAアクセス用リポジトリを追加する。
- JPAで全データを取得するには、JPAアクセス用リポジトリのfindAllメソッドを利用する。
- HTML上でリストのデータを一覧表示するには、th:eachタグでリストの各データを取得し、取得したデータの各変数はth:textタグで表示する。