Spring Boot DB連携

Spring BootでOracle接続処理を実装してみた

Spring BootのWEBアプリケーションを開発する際、なんらかのデータベースにアクセスすることが多いが、SpringのJPAライブラリを利用すると、少ないコード量でDBアクセス処理の記述を行うことができる。

ただし、データベースアクセスが行えるようにするには、Oracle JDBCに接続するjarファイルの追加や、build.gradleの設定変更も必要になってくる。

今回は、最もよく使われているOracleデータベースからデータを取得し、その結果を表示するサンプルプログラムを作成してみたので、共有する。

前提条件

以下の記事のSpring BootのWEB画面用アプリが作成済であること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

また、以下の記事のlombokの設定が完了していること。

IntelliJ IDEAでlombokを使ってみたlombokというライブラリを使うと、JavaBeanクラスにおいて、アノテーション付与するだけで、getterメソッド・setterメ...

 

やってみたこと

  1. Oracle XEのインストール
  2. 接続用テーブルの作成とデータ追加
  3. Oracle JDBC接続用jarの配置
  4. build.gradleにOracle接続用定義を追加
  5. サンプルプログラムの作成と実行

 

Oracle XEのインストール

「Oracle XE」を利用すると、無料でOracleのデータベースを利用できるので、Oracle XEのインストールを行った。

Oracle XEのインストール手順は、以下を参照のこと。ただし、最新の18cをインストールしようとしたところ失敗してしまったので、今回は、以前のバージョンの「Oracle Database Express Edition 11g Release 2」をインストールした。

Windows端末にMySQL、PostgreSQL、Oracleをインストールしてみた今回はいろいろな種類のデータベースを使ってみたかったので、Windows端末に、MySQL、PostgreSQL、Oracleそれぞれの...

接続用テーブルの作成とデータ追加

今回作成するサンプルプログラムがアクセスするテーブル「user_data」を作成した。実行したSQLは以下の通り。

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
);
insert into user_data values (1, 'テスト プリン', 2012, 2, 28, '2');
insert into user_data values (2, 'テスト プリン2', 2013, 3, 19, '1');
commit;

上記SQLを実行した結果は下図の通り。
user_dataテーブル



Oracle JDBC接続用jarの配置

Oracle JDBCに接続するjarファイルは、Oracle XEをインストール後の以下の場所に配置されている。
oracle_jdbc接続用jar

上記のうちの「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ライブラリの定義となる。

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については以下のサイトを参照のこと。

IntelliJ IDEAでlombokを使ってみたlombokというライブラリを使うと、JavaBeanクラスにおいて、アノテーション付与するだけで、getterメソッド・setterメ...



サンプルプログラムの作成と実行

作成したサンプルプログラムの構成は、「Oracle JDBC接続用jarの配置」に記載した通りとなる。

まず、Oracleに接続するための接続情報を、application.propertiesに追加した。追加したプロパティファイルの内容は以下の通り。

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アクセス用リポジトリを作成した。そのプログラムの内容は以下の通り。

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;

}
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メソッドを呼び出している。

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タグを利用している。

<!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タグで表示する。