0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-07-24

JPAとは

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

とりあえずJPAを使うにあたって

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

実行イメージ

  • 全件検索
    image.png

  • 主キー(従業員番号)検索
    image.png

  • 部署番号検索を行う
    image.png

  • 従業員名&部署番号検索を行う
    image.png

  • 従業員名部分検索を行う
    image.png

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;

}


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

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についてもメモを残しておこうと感じた

次の記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0