目次
はじめに
Javaのフレームワーク「Spring Boot」とデータベース操作を簡単に利用できる「Spring Data JPA」を使い、複合主キー(テーブルに複数の主キーがある)のテーブルからデータを抽出する方法を紹介します。
本記事で作成する「一覧画面」のイメージとテーブル定義は以下の通り。
[テーブル定義]
物理名 | 論理名 | データ型 | NOT NULL | 説明 |
school_year | 学年 | INT | 〇 | 主キー |
group | 組 | INT | 〇 | 主キー |
number | 出席番号 | INT | 〇 | 主キー |
name | 名前 | VARCHAR(100) | 〇 | 生徒の名前 |
[CREATE文]
CREATE TABLE `sampledb`.`student` (
`school_year` int NOT NULL,
`group` int NOT NULL,
`number` int NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`school_year`,`group`,`number`)
);
[INSERT文]
INSERT INTO `sampledb`.`student` (`school_year`, `group`, `number`, `name`) VALUES ('1', '1', '1', '鈴木一郎');
INSERT INTO `sampledb`.`student` (`school_year`, `group`, `number`, `name`) VALUES ('1', '1', '2', '佐藤二郎');
INSERT INTO `sampledb`.`student` (`school_year`, `group`, `number`, `name`) VALUES ('1', '1', '3', '田中三郎');
INSERT INTO `sampledb`.`student` (`school_year`, `group`, `number`, `name`) VALUES ('1', '3', '1', '伊藤四郎');
スポンサーリンク
開発環境
開発環境は以下のとおり。
開発環境 | 名称 | 説明 |
開発言語 | Java | 人気の開発言語 |
開発ツール | Eclipse | Javaでの定番開発ツール |
フレームワーク | Spring Boot | 人気のSpringフレームワークをベースとしたフレームワーク |
テンプレートエンジン | Thymeleaf | Spring Bootと相性が良いテンプレートエンジン |
データベース | MySQL | フリーで利用できる人気データベース |
開発環境構築手順はこちら
ディレクトリ構成
ディレクトリ構成は以下のとおり。
springSample
|
|___src.main.java
|
|___com.example.demo
| |
| |___controller
| | |
| | |__StudentController.java
| |
| |___entity
| | |
| | |___Student.java
| | |
| | |___StudentKey.java
| |
| |___repository
| | |
| | |___StudentRepository.java
| |
| |___service
| |
| |___StudentService.java
|
|___src.main.resources
|
|___templates
| |
| |___student
| |
| |___list.html
|
|___static
|
|___css
|
|___list.css
バックエンド(サーバー)側のソースコード
エンティティクラス(Student.java)
データベースから取得したデータを格納するエンティティクラスの内容は以下の通り。@Dataアノテーションを使用して、getter、setterの定義を省略しています。
また、@IdClassでPrimaryKeyを定義したクラスを指定します。
package com.example.demo.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import lombok.Data;
/**
* 生徒情報 Entity
*/
@Entity
@Data
@Table(name="student")
@IdClass(value=StudentKey.class)
public class Student implements Serializable {
/**
* 学年
*/
@Id
@Column(name="school_year")
private int schoolYear;
/**
* 組
*/
@Id
@Column(name="group")
private int group;
/**
* 出席番号
*/
@Id
@Column(name="number")
private int number;
/**
* 名前
*/
@Column(name="name")
private String name;
}
PrimaryKeyを定義したクラス(StudentKey.java)
複合主キーのテーブルを扱う場合は、PrimaryKeyを定義したクラスを作る必要があります。
package com.example.demo.entity;
import java.io.Serializable;
import lombok.Data;
/**
* 生徒情報の主キー用 Entity
*/
@Data
public class StudentKey implements Serializable {
/**
* 学年
*/
private int schoolYear;
/**
* 組
*/
private int group;
/**
* 出席番号
*/
private int number;
}
リポジトリクラス(StudentRepository.java)
データベースにアクセスする為のリポジトリクラスの内容は以下の通り。JpaRepositoryには、JpaRepository<Student, StudentKey>のようにエンティティクラスとPrimaryKeyを定義したクラスを指定します。
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.entity.Student;
import com.example.demo.entity.StudentKey;
/**
* 生徒情報 Repository
*/
@Repository
public interface StudentRepository extends JpaRepository<Student, StudentKey> {}
サービスクラス(StudentService.java)
サービスクラスの内容は以下の通り。サービスクラスでは、Spring Data JPAで用意されている「findAll()」を使いテーブルの内容を全件取得しています。
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.Student;
import com.example.demo.repository.StudentRepository;
/**
* 生徒情報 Service
*/
@Service
public class StudentService {
/**
* 生徒情報 Repository
*/
@Autowired
private StudentRepository studentRepository;
/**
* 生徒情報 全検索
* @return 検索結果
*/
public List<Student> searchAll() {
return studentRepository.findAll();
}
}
コントローラークラス(StudentController.java)
コントローラクラスの内容は以下の通り。
package com.example.demo.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.example.demo.entity.Student;
import com.example.demo.service.StudentService;
/**
* 生徒情報 Controller
*/
@Controller
public class StudentController {
/**
* 生徒情報Service
*/
@Autowired
private StudentService studentService;
/**
* 生徒情報一覧画面を表示
* @param model Model
* @return 生徒情報一覧画面
*/
@GetMapping(value = "/student/list")
public String displayList(Model model) {
List<Student> studentlist = studentService.searchAll();
model.addAttribute("studentlist", studentlist);
return "student/list";
}
}
フロントエンド(クライアント)側のソースコード
スポンサーリンク
HTML(list.html)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title>生徒情報一覧</title>
<link href="/css/list.css" rel="stylesheet"></link>
<meta charset="utf-8" />
</head>
<body>
<h1>生徒情報一覧</h1>
<table>
<thead>
<tr>
<th>学年</th>
<th>組</th>
<th>出席番号</th>
<th>名前</th>
</tr>
</thead>
<tbody>
<tr th:each="student : ${studentlist}" th:object="${student}">
<td class="center" th:text="*{schoolYear}"></td>
<td class="center" th:text="*{group}"></td>
<td class="center" th:text="*{number}"></td>
<td th:text="*{name}"></td>
</tr>
</tbody>
</table>
</body>
</html>
スタイルシート(list.css)
body {
width: 90%;
}
table{
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
table th, table td {
border: 1px solid #ddd;
padding: 6px;
}
table th {
background-color: #F2F2F2;
}
.center {
text-align: center;
}
動作確認
Spring Bootプロジェクトを実行して http://localhost:8080/student/list へアクセスします。
一覧画面が表示され、デーベースから取得した値が一覧に表示されていれば完了です。