JPAとは
- Java Persistence APIの略
- データベース操作を行うライブラリの一つ
- SQLを自動作成、実行する(→SQL文を書く必要すらない。そんな便利な世界があったとは…)
とりあえずJPAを使うにあたって
- 従業員テーブル(従業員番号、名前、部署番号)を用意。→全部で9件用意。
- JpaRepositoryが定義しているCRUD処理用のメソッドを使ってみる。→今回は検索のみ。
実行イメージ
Controller
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
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
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;
}
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
- テーブルに格納している従業員情報の表示
- 従業員番号、従業員名、部署番号の表示
ソースコード
ふりかえり
- 簡易なSQL文だったらJPAを利用すると良いことがわかった
- 他の用意されているupdate、insert、deleteについてもメモを残しておこうと感じた