JPAという便利なものがあるらしい

## JPAとは
- Java Persistence APIの略
- データベース操作を行うライブラリの一つ
- SQLを自動作成、実行する(→SQL文を書く必要すらない。そんな便利な世界があったとは…)

## とりあえずJPAを使うにあたって
- 従業員テーブル(従業員番号、名前、部署番号)を用意。→全部で9件用意。
- JpaRepositoryが定義しているCRUD処理用のメソッドを使ってみる。→今回は検索のみ。

## 実行イメージ
- 全件検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1715093/623c3361-a177-f508-3937-054a119452ec.png)

- 主キー(従業員番号)検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1715093/7beffb4d-6f52-b9c5-6b77-5e44cf3238a6.png)

- 部署番号検索を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1715093/84cd568f-58ec-722c-b72f-9c32755dbde5.png)

- 従業員名＆部署番号検索を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1715093/93c4cd56-9946-7017-8f93-3a2c659db48a.png)

- 従業員名部分検索を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1715093/4a56a459-83dc-e2a4-93c3-f7c2fd11e11b.png)

## Controller
```java
package jp.co.ttt.employee.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.ttt.employee.repository.EmployeeRepository;

@Controller
public class EmployeeController {

	@Autowired
	EmployeeRepository repository;

	// 全件検索
	@RequestMapping(path = "/findAll")
	public String showemployeeList(Model model) {

		model.addAttribute("employees", repository.findAll());
		return "employee/employee_list";
	}

	// 主キー(従業員番号)検索
	@RequestMapping(path = "/getOne/{id}")
	public String showEmployee(@PathVariable int id, Model model) {

		model.addAttribute("employees", repository.getOne(id));
		return "employee/employee_list";
	}

	// 部署番号検索を行う
	@RequestMapping(path = "/findByDeptNo/{deptNo}")
	public String showEmpoloyeeListByDeptNo(@PathVariable int deptNo, Model model) {

		System.out.println(repository.findByDeptNo(deptNo));
		model.addAttribute("employees", repository.findByDeptNo(deptNo));
		return "employee/employee_list";
	}

	// 従業員名＆部署番号検索を行う
	@RequestMapping(path = "/findByNameAndDeptNo/{name}/{deptNo}")
	public String showEmpoloyeeListByNameAndDeptNo(@PathVariable String name, @PathVariable int deptNo,
			Model model) {

		model.addAttribute("employees", repository.findByNameAndDeptNo(name, deptNo));
		return "employee/employee_list";
	}

	// 従業員名部分検索を行う
	@RequestMapping(path = "/findByNameLike/{name}")
	public String showEmployeeListNameLike(@PathVariable String name, Model model) {

		model.addAttribute("employees", repository.findByNameLike("%" + name + "%"));
		return "employee/employee_list";
	}
}


```
- 全件検索、主キー検索はデフォルトで用意されている。
- 部署番号検索、従業員名＆部署番号検索、従業員名部分検索はこちらで定義。(EmployeeRepositoryインターフェイスにて)

## Repository
```java
package jp.co.ttt.employee.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.ttt.employee.entity.Employee;

public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

	// 部署番号検索
	List<Employee> findByDeptNo(Integer deptNo);

	// 従業員名＆部署番号検索
	List<Employee> findByNameAndDeptNo(String name, Integer deptNo);

	// 従業員名部分検索
	List<Employee> findByNameLike(String name);

}

```
- 検索したい文字列 or 数値を引数で渡している。
- findBy[検索条件]で定義する→[findBy]に続くフィールド名、キーワードに応じた条件検索を実行する。

## Entity
```java
package jp.co.ttt.employee.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

// name属性はテーブル名
@Data
@Entity
@Table(name = "employee")
public class Employee {

	// 主キーの列は@Id
	@Id
	private Integer id;

	// 主キー以外の列は@Column
	@Column
	private String name;

	// 主キー以外の列は@Column
	@Column
	private Integer deptNo;

}


```
- @Table→エンティティとテーブルを対応づけている。
- 主キーの列に対応しているフィールドは@ID
- 主キー以外の列に対応しているフィールドは@Column

## HTML
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>従業員情報</title>
</head>
<body>
	<h1>従業員情報</h1>
	<table border="1">
		<tr>
			<th>従業員番号</th>
			<th>従業員名</th>
			<th>部署番号</th>
		</tr>
		<tr th:each="employee:${employees}">
			<td th:text="${employee.id}"></td>
			<td th:text="${employee.name}"></td>
			<td th:text="${employee.deptNo}"></td>
		</tr>
	</table>
</body>
</html>
```
- メソッド確認用のHTML
- テーブルに格納している従業員情報の表示
- 従業員番号、従業員名、部署番号の表示

## ソースコード
https://github.com/takaaki18/employee

## ふりかえり
- 簡易なSQL文だったらJPAを利用すると良いことがわかった
- 他の用意されているupdate、insert、deleteについてもメモを残しておこうと感じた

## 次の記事
https://qiita.com/takaakitanaka_cre-co/items/fa11fb1d6d956ce1d76d