初めに
あらゆるシステムにおいて、画面に入力したデータをDBへ追加したり、DBから必要なデータを取得して画面に表示したりと、 DBは欠かせない存在です。
MVCモデルで開発を行う際に、Modelの部分でDBを操作しています。
ModelでDBから値を受け取り、 Controllerを経由して画面へ送られます。
この単元では実際にSpringプロジェクトとOracle Databaseを接続し、DBのデータをブラウザに表示する方法の導入を学んでいきます!
命名規則
これまででSQLの基礎は学習できましたので、改めてDB関連の命名ルールをおさらいしましょう。
以降の研修の中では、この命名規則に則ってテーブル作成等をしてください。
※企業・会社によっては独自の方針がある可能性がありますので確認しましょう!
DB関連命名ルール
テーブル名のルール
- 小文字の複数形
- 単語が複数ある場合にはスネーク記法
- 中間テーブル(多対多)の場合、【テーブル名の単数名_テーブル名の単数名】
(例)従業員マスタとしてのテーブル名【employees】
(例)productsテーブルとordersテーブルの中間テーブル名【product_order】
カラム名のルール
- 単語が複数ある場合にはスネーク記法
- リレーション先のidをカラムと紐付ける場合(外部キー)、【テーブル名の単数名_id】
(例)入社日【start_on】、employeesテーブルのidに紐づける場合は【employee_id】
その他、Javaにおける命名やコーディング規約が載っていますので、下記をよく参考にしてください。
Javaコーディング規約 | Future Enterprise Coding Standards
サンプルデータの用意
DB接続するにあたり、サンプルとして使用するテーブルを作成し、データを入れておきましょう。
それぞれSQL文を実行してください。

CREATE TABLE employees (
id INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY,
code CHAR(4 CHAR), name VARCHAR(100 CHAR), age INTEGER,
PRIMARY KEY(id) );

INSERT INTO employees (code, name,age) VALUES('0001', '田中', 25);
INSERT INTO employees (code, name,age) VALUES('0002', '山田', 30);
INSERT INTO employees (code, name,age) VALUES('0003', '佐々木', 26);
INSERT INTO employees (code, name,age) VALUES('0004', '鈴木', 18);
INSERT INTO employees (code, name,age) VALUES('0005', '中村', 44);
INSERT INTO employees (code, name,age) VALUES('0006', '田中', 40);
INSERT INTO employees (code, name,age) VALUES('0007', '山田', 52);
COMMIT;
☆データ操作言語を使用した後は、コミットを忘れず実行しましょう!
DB側では見かけ上は登録されていても、まだコミットされていない=トランザクション内である場合、
DB外部(プロジェクト側)からのアクセスではコミットされていないデータを参照できません。
※「Oracle Database」の 「Oracle Databaseの特徴(トランザクション)」 を参照のこと。
DB接続
Spring Bootにおけるデータベースアクセス
Springでデータベース操作する方法、使用できるモジュールは多数あります。代表的なもので言えば、JdbcTemplate、Spring Data JPA、MyBatisなど…
本マニュアルでは、Spring Data JPAを採用しています。
Spring Data JPAの詳細は次の単元で説明しますが、選定の理由としては日本での人気が高いこと、Spring Bootの標準技術とされているためです。また、奥が深い側面もありますが、初歩的な記述の範囲においては初心者向けとも言えます。
Spring BootにおけるDB接続の準備
フレームワークには、DBを扱うためのクラスや設定が用意されており、誰でも簡単にDBへ接続して操作を行えます。
JavaでWebアプリケーションを作る場合、下記が適切に設定されていればDBへ接続することができます。
①JDBCドライバの導入
②DB接続情報
③Spring data JPAの適用
①JDBCドライバの導入
JavaからDBへの接続の経路は「Java―JDBC API―JDBC ドライバ―DB」という流れになっています。
JDBC API は、Javaからデータベースに接続するためのAPIで、Javaのプログラム上で利用するものです。JDBC自体はDBMSの種類に依存せず、DBMSを変えても基本的にプログラム上の記述は変わりません。
JDBC ドライバは、DBMSごとの仕様差を吸収するためにそれぞれのベンダから提供されており、OracleであればOracle用のJDBCドライバを使う必要があります。
参考:JDBCとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
フレームワークを使用しないJavaプロジェクトでは、自分でJDBCドライバをダウンロードして、適切な場所に配置し、ビルドパスというものを通して…といった作業する必要がありますが、Spring Bootでは設定ファイルに記述するだけでそれらが完了します。
プロジェクト直下にあるMavenプロジェクトファイル(pom.xml)に下記を追記しましょう。(OracleのJDBCドライバ用)<dependencies>タグ内に記述してください。
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
☆上記のように追記する他、【Spring スターター・プロジェクト(Spring Initializr)】でSpring Bootプロジェクトを作成する際、Oracle JDBCドライバにチェックを入れて導入することも可能です。
②DB接続情報
DBのURLやユーザー・パスワード、どのJDBCドライバなのか、といったDBへ接続するための情報があって初めて接続ができるようになります。
Spring Bootプロジェクトでは、application.propertiesファイルに記述します。
src/main/resources/application.properties

下記を追記してください。
#のグレーアウト部分はコメントです。
username、passwordはスキーマです。スキーマを変更したい場合は書き換えてください。
# DB接続情報
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/XEPDB1
spring.datasource.username=sample
spring.datasource.password=sample123
③Spring data JPAの適用
Spring data JPAを導入します。
こちらもJDBCドライバと同様、設定ファイルpom.xmlに記載するだけで使用可能になります。
先ほど同様、プロジェクト直下にあるpom.xmlに下記を追記しましょう。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
上記の3ファイルが保存出来たら、プロジェクトを更新します。
Spring Bootアプリケーションを実行中の場合は終了させてから、
プロジェクト名を右クリック>Maven>プロジェクトの更新 をクリックします。
Spring Bootアプリケーションを実行して、コンソール出力の最後に「Started ○○Application…」とメッセージが出れば問題なくDB接続出来ています!
JPAの導入
DB接続の設定ができたので、実際にSpring Data JPAを扱ってブラウザにDBデータを表示するサンプルを作りましょう!
準備:パッケージの作成
JPAを活用するには、以下で作成していくファイルが最低限必要になります。
まずはそれらを保存するためのパッケージ・フォルダを作成しましょう。
・「src/main/java」フォルダ内に下記のパッケージを作成
com.cmps.spring.entity
com.cmps.spring.repository
・「src/main/resources/templates」フォルダ内に「employee」フォルダを作成

Entityの作成
JPAにおいてデータベースのテーブルと対応するクラスをEntity(エンティティ)と言い、インスタンスがデータベースの1レコードに相当します。DBから受け取ったデータを入れたり、DBに保存する際に受け渡したりするために、Spring側で扱う箱のようなものです。「Spring Bootの基本的な処理の流れ」で扱ったFormクラスと似た作りです。
employeesテーブルに対応するEntityとして「Employee」クラスを作成しましょう。テーブル名の単数形、アッパーキャメルで命名します。
「com.cmps.spring.entity」パッケージに「Employee.java」を作成し、下記のコードを記述します。
【com/cmps/spring/entity/Employee.java】
package com.cmps.spring.entity;
import java.io.Serializable;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.persistence.Id;
import jakarta.persistence.Column;
import lombok.Data;
@Entity
@Data
@Table(name = "employees")
public class Employee implements Serializable {
// ID
@Id
private Integer id;
// 従業員コード
@Column
private String code;
// 名前
@Column
private String name;
// 年齢
@Column
private Integer age;
}
Entityファイルの記述内容を解説します。
クラス名の前にアノテーションについて
・@Entityは、このクラスがアノテーションであることを示しています。これを記述しないとEntityとして扱われませんので必須です。
・@Dataはクラス内の各フィールド変数に対してGetterメソッド・Setterメソッドを作成してくれます。
・@Table(name = “employees”)はこのEntityをemployeesテーブルに紐づけように定義しています。必須の記述です。引数nameを記述しない場合、クラス名を大文字にしたテーブルであれば自動で紐づけされます。
クラス内部の記述について
・各カラムに対応する変数を宣言しています。DBから取り出した値をカラムごとに各変数に格納されます。
カラムと対応することを示すために、@Columnアノテーションが必須です。変数名とカラム名が一致すれば自動的に紐づけてくれます。異なる場合は@Column(name=”○○”)と言った形で明示的に指定します。
・@Idは、主キーであることを示しています。これも必ず記載します。
Entityクラスは、所謂DTO(Data Transfer Object、異なるシステムまたはアプリケーション層間でデータを転送するためのオブジェクト)に近しいものです。DAO/DTOの概念はJavaの基礎としてイメージを持っておくといいでしょう。
参考サイト:DaoとDtoとDBの関係をJavaコードで確認
Repositoryの作成
Spring Data JPAでは、インタフェースJpaRepository(またはCrudRepository)を継承したRepository(リポジトリ)を作るだけで、基本的なDB操作を実行するメソッドを自動的に生成・実装してくれます。
基本的な処理以外にも自分で定義して実装することもできます。
次の単元でもう少し具体的な説明をしますが、今は「Repositoryを作成すれば基本的な処理はすぐに使える」という点を押さえてください。
Employee用のRepository、「EmployeeRepository」を作成しましょう。テーブル名の単数形、アッパーキャメルで命名します。
「com.cmps.spring.repository」パッケージに「EmployeeRepository.java」クラスを作成し、下記のコードを記述します。
【com/cmps/spring/repository/EmployeeRepository.java】
package com.cmps.spring.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.cmps.spring.entity.Employee;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
}
冒頭にも説明した通り、内部的に用意されたメソッドを活用できるので、基本の処理を実行するだけであればRepositoryのブロック内は空で問題ありません。
記述内容を解説します。
・@Repositoryアノテーションは、このクラスがRepositoryであることを示します。@Controllerなどと同様に、そのクラスがどういう役割を果たすものかを示すアノテーションです。
・JpaRepository<Employee, Integer>という指定により、このRepositoryの対象となるEntityクラスが Employeeであり、プライマリーキーが Integer型と定義しています。
・extendsとある通り、EmployeeRepositoryはJpaRepositoryを継承しています。
Controller、Viewの作成
Controllerの作成
「EmployeeController」を作成します。
「com.cmps.spring.controller」パッケージに「EmployeeController.java」クラスを作成し、下記のコードを記述します。
【com/cmps/spring/controller/EmployeeController.java】
package com.cmps.spring.controller;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import com.cmps.spring.entity.Employee;
import com.cmps.spring.repository.EmployeeRepository;
@RequestMapping("/emp")
@Controller
public class EmployeeController {
@Autowired
private EmployeeRepository employeeRepository;
/**
* employeesテーブルからid1のデータを取得しブラウザに表示する
*
* @param model Model Model情報
* @return "employee/index" String viewファイル
*/
@GetMapping("/find")
public String find(Model model) {
Optional<Employee> employeeOpt = employeeRepository.findById(1);
Employee employee = employeeOpt.get();
model.addAttribute("employee", employee);
return "employee/index";
}
}
・@Autowiredアノテーションは、DI(Dependency Injection、依存性の注入)の役割を担ってくれています。
DIとはソフトウェアの設計パターンの一つで、クラス間の依存関係をフレームワーク等で管理して外部から注入する仕組みのことです。
ややこしいと思いますので、最初のうちはものすごく要約してクラス間の紐づけ・インスタンスの生成するために必要 程度に捉えて構いません。
・private EmployeeRepository employeeRepository;を見ると変数の宣言だけの記述ですが、
前述のDIにより、このクラス内ではこのままemployeeRepositoryからメソッドを呼び出して使うことができる状態になっています。
findメソッド内の記述を見ていきましょう。
・Optional<Employee> employeeOpt = employeeRepository.findById(1);
→まず右辺から見ていきましょう。employeeRepositoryに備わっているfindByIdメソッドを使用しています。
Idの型、カラムは指定していますので、メソッド名そのままで「引数に渡したID検索したレコードを取得」してくれます。
SELECT文で書くと「select * from employees where id=1;」といった形です。
JPAを使うとこのように直感的に、むしろSQLの知識がなくても処理が行えるのです!
→次に左辺では、Optionalというクラスを指定しています。
これはNULLかもしれない値が返されるオブジェクトをラップするクラスで、NULLが返されたときの処理をしやすくするものです。
JPAのfindByIdメソッドでは、デフォルトでこのクラス型で値が返るようになっています。
・Employee employee = employeeOpt.get(); では、Optionalにget()メソッドを使うことで、Employeeオブジェクトに変換しています。
・model.addAttribute("employee", employee);では、Viewで使用するために、modelのattributeとしてemployeeオブジェクトを渡しています。
Viewの作成
続いて、Controllerのfindメソッドの最後にreturnで指定されているView “employee/index”を作成しましょう。
「src/main/resources/templates/employee」フォルダに「index.html」クラスを作成し、下記のコードを記述します。
【src/main/resources/templates/employee/index.html】
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>emplyeesテーブル1人分のデータ表示</title>
</head>
<body>
<table>
<thead>
<tr>
<th>id</th>
<th>code</th>
<th>name</th>
<th>age</th>
</tr>
</thead>
<tbody>
<tr th:object="${employee}">
<td th:text="*{id}"></td>
<td th:text="*{code}"></td>
<td th:text="*{name}"></td>
<td th:text="*{age}"></td>
</tr>
</tbody>
</table>
</body>
</html>
View側の記述内容としては、Thymeleafの単元で学習した「選択オブジェクトへの変数式」の方法を使用しているだけです。
以上で必要な記述は完了できました。
早速、アプリケーションを実行してブラウザで表示してみましょう!
URL:http://localhost:8080/emp/find

なお、findByIdメソッドの引数(取得する対象のid)を変えれば他のデータも表示できますので確認してみてもいいでしょう。
次の単元では、更にJPAを深堀りしていきます!
