カテゴリ: SpringのDB操作 更新日: 2025/05/27

JPAを使った簡単なCRUDの実装を完全ガイド!初心者でもわかるデータ操作

JPAを使った簡単なCRUDの実装
JPAを使った簡単なCRUDの実装

新人と先輩の会話形式で理解しよう

新人

「Spring Bootでデータベースの操作をしたいんですが、CRUDって何ですか?」

先輩

「CRUDは、データベースの基本操作であるCreate(作成)、Read(読み取り)、Update(更新)、Delete(削除)の頭文字を取ったものだよ。」

新人

「なるほど!それをJPAで実装するにはどうすればいいんですか?」

先輩

「それじゃあ、JPAを使ったCRUDの実装方法を順を追って説明していこう!」

1. CRUDとは何か?(基本操作:Create・Read・Update・Delete)

1. CRUDとは何か?(基本操作:Create・Read・Update・Delete)
1. CRUDとは何か?(基本操作:Create・Read・Update・Delete)

CRUDとは、データベースを操作する際の基本的な4つの処理を指します。

  • Create(作成):新しいデータを追加する操作
  • Read(読み取り):既存のデータを取得する操作
  • Update(更新):既存のデータを変更する操作
  • Delete(削除):既存のデータを削除する操作

これらの操作は、アプリケーション開発において非常に重要であり、「JPA CRUD 実装」を学ぶことで、効率的にデータベースと連携することができます。

2. JPAでCRUDを実装する流れ(エンティティ・リポジトリ・コントローラの関係)

2. JPAでCRUDを実装する流れ(エンティティ・リポジトリ・コントローラの関係)
2. JPAでCRUDを実装する流れ(エンティティ・リポジトリ・コントローラの関係)

Spring BootでJPAを使ってCRUDを実装するには、以下の3つのコンポーネントを作成します。

  • エンティティ(Entity):データベースのテーブルと対応するJavaクラス
  • リポジトリ(Repository):データベースへのアクセスを担当するインターフェース
  • コントローラ(Controller):ユーザーからのリクエストを受け取り、適切な処理を行うクラス

これらを組み合わせることで、「Spring Boot CRUD 入門」として基本的なデータ操作を実現できます。

2-1. エンティティの作成

まず、データベースのテーブルと対応するエンティティクラスを作成します。例えば、ユーザー情報を管理する場合、以下のようなクラスを作成します。


package com.example.demo.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // ゲッターとセッター
    // コンストラクタ
}

このように、@Entityアノテーションを付けることで、JPAがこのクラスをエンティティとして認識します。@Idは主キーを示し、@GeneratedValueで自動採番を指定します。これが「JPA エンティティとは」の基本的な形です。

2-2. リポジトリの作成

次に、データベース操作を行うリポジトリインターフェースを作成します。


package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 必要に応じてカスタムメソッドを定義
}

JpaRepositoryを継承することで、基本的なCRUD操作が自動的に提供されます。これにより、SQLを直接書かずにデータ操作が可能となります。

2-3. コントローラの作成

最後に、ユーザーからのリクエストを処理するコントローラクラスを作成します。


package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public String getUsers(Model model) {
        List<User> users = userRepository.findAll();
        model.addAttribute("users", users);
        return "userList";
    }

    @PostMapping("/users")
    public String addUser(@ModelAttribute User user) {
        userRepository.save(user);
        return "redirect:/users";
    }

    // その他のCRUD操作(更新、削除)も同様に実装
}

このように、@Controllerアノテーションを使用してコントローラを定義し、リクエストを処理します。@GetMapping@PostMappingを使って、URLとメソッドをマッピングします。

3. データ登録(Create)の実装方法

3. データ登録(Create)の実装方法
3. データ登録(Create)の実装方法

ここでは「Spring Boot 登録機能 JPA」の基本として、新しいユーザー情報を登録する処理の実装方法を解説します。登録処理では、エンティティクラスで定義されたデータをフォームから受け取り、リポジトリを通じてデータベースに保存します。

3-1. 入力フォームを表示する画面の作成

まずは新しいユーザー情報を入力するためのHTML画面(Thymeleafテンプレート)を用意します。Spring Bootではテンプレートファイルをsrc/main/resources/templates配下に配置します。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>ユーザー登録</title>
</head>
<body>
    <h1>ユーザー登録フォーム</h1>
    <form th:action="@{/users}" th:object="${user}" method="post">
        <p>名前:<input type="text" th:field="*{name}" /></p>
        <p>メール:<input type="text" th:field="*{email}" /></p>
        <button type="submit">登録</button>
    </form>
</body>
</html>

このテンプレートでは、th:objectでUserエンティティと連携し、th:fieldを使ってフォームの各フィールドにバインドしています。

3-2. コントローラでの登録処理

次に、ユーザー情報を受け取って保存するための処理を@Controllerに実装します。


@GetMapping("/users/new")
public String showForm(Model model) {
    model.addAttribute("user", new User());
    return "userForm";
}

@PostMapping("/users")
public String saveUser(@ModelAttribute User user) {
    userRepository.save(user);
    return "redirect:/users";
}

上記のようにGET /users/newでフォームを表示し、POST /usersで入力データを受け取って登録します。登録処理はuserRepository.save(user)で行い、これはJPAが提供するデータ登録の代表的なメソッドです。

このようにして、初心者でもシンプルな形でSpring Boot 登録機能 JPAの基本を理解できます。

4. データの取得(Read)の実装方法

4. データの取得(Read)の実装方法
4. データの取得(Read)の実装方法

続いて「JPA データ取得」処理の実装です。ここでは、ユーザー一覧の表示と個別詳細の表示の2つに分けて説明します。

4-1. 一覧表示の処理

JPAでは、JpaRepositoryに定義されたfindAll()メソッドを使って、データベースに登録されているすべてのユーザーを取得できます。次のように一覧画面に表示する処理をコントローラに書きます。


@GetMapping("/users")
public String listUsers(Model model) {
    List<User> userList = userRepository.findAll();
    model.addAttribute("users", userList);
    return "userList";
}

テンプレート側では以下のように、th:eachを使ってユーザー情報を繰り返し表示します。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>ユーザー一覧</title>
</head>
<body>
    <h1>ユーザー一覧</h1>
    <table border="1">
        <tr>
            <th>ID</th><th>名前</th><th>メール</th><th>詳細</th>
        </tr>
        <tr th:each="user : ${users}">
            <td th:text="${user.id}">ID</td>
            <td th:text="${user.name}">名前</td>
            <td th:text="${user.email}">メール</td>
            <td><a th:href="@{/users/{id}(id=${user.id})}">詳細</a></td>
        </tr>
    </table>
</body>
</html>

この構造により、ユーザー情報の一覧を簡単に取得し、表示することが可能です。

4-2. 詳細表示の処理

次に、ユーザー個別の詳細情報を表示する処理です。これはURLパスにIDを含めて、1件のデータを取り出す仕組みで構成します。


@GetMapping("/users/{id}")
public String viewUser(@PathVariable Long id, Model model) {
    User user = userRepository.findById(id).orElse(null);
    model.addAttribute("user", user);
    return "userDetail";
}

HTMLテンプレートでは次のように個別の情報を表示します。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>ユーザー詳細</title>
</head>
<body>
    <h1>ユーザー詳細</h1>
    <p>ID:<span th:text="${user.id}">1</span></p>
    <p>名前:<span th:text="${user.name}">名前</span></p>
    <p>メール:<span th:text="${user.email}">メール</span></p>
    <a th:href="@{/users}">戻る</a>
</body>
</html>

このようにSpring Data JPA Read 処理を活用することで、データベースからの情報取得を簡単に行うことができます。

注意点として、findById()は戻り値がOptional型であるため、orElse(null)のようにnull処理を明示することが大切です。データが見つからなかったときにエラーを回避できます。

これで、JPAを使った登録処理と取得処理の基本的な実装が完了しました。次は「更新」と「削除」機能の実装に進んでいきましょう。

5. データの更新(Update)の実装方法(編集フォーム→保存)

5. データの更新(Update)の実装方法(編集フォーム→保存)
5. データの更新(Update)の実装方法(編集フォーム→保存)

つづいては「JPA 更新処理」を実装していきましょう。既存のユーザー情報を変更するには、まず該当するデータを画面に表示し、ユーザーが編集した内容をデータベースに保存する流れになります。

一般的な流れとしては、

  • 対象データを取得して編集画面に表示する
  • 編集フォームから更新データを送信する
  • JPAのsave()メソッドでデータを更新する

となります。更新の場合も新規登録と同様にsave()メソッドを使いますが、IDが一致するエンティティが存在する場合は更新として扱われます。

5-1. 編集フォームの作成

まず、編集用のHTMLフォームを用意します。これは新規登録フォームとほぼ同じですが、既存データを表示する点が異なります。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>ユーザー編集</title>
</head>
<body>
    <h1>ユーザー情報の編集</h1>
    <form th:action="@{/users/update}" th:object="${user}" method="post">
        <input type="hidden" th:field="*{id}" />
        <p>名前:<input type="text" th:field="*{name}" /></p>
        <p>メール:<input type="text" th:field="*{email}" /></p>
        <button type="submit">更新</button>
    </form>
</body>
</html>

このようにth:fieldを使って既存の値を自動で埋め込みます。idを隠しフィールドとして渡すことが重要です。

5-2. コントローラでの更新処理

次にコントローラ側の処理です。まず編集画面を表示するためのメソッドを定義し、次に更新内容を受け取って保存するメソッドを定義します。


@GetMapping("/users/edit/{id}")
public String showEditForm(@PathVariable Long id, Model model) {
    User user = userRepository.findById(id).orElse(null);
    model.addAttribute("user", user);
    return "editForm";
}

@PostMapping("/users/update")
public String updateUser(@ModelAttribute User user) {
    userRepository.save(user);
    return "redirect:/users";
}

findById()で対象のユーザーを取得し、フォームに渡しています。その後、save()でデータを更新します。IDが存在する場合は更新として処理されます。

初心者がつまずきやすいポイント:
更新処理でも新規登録と同じsave()を使うため、IDがnullの場合は新規作成とみなされます。必ずIDがフォームから送られていることを確認しましょう。

6. データの削除(Delete)の実装方法と注意点

6. データの削除(Delete)の実装方法と注意点
6. データの削除(Delete)の実装方法と注意点

最後に「Spring Boot 削除機能」を実装します。JPAでは、deleteById()delete()といったメソッドを使ってデータ削除を行います。

ただし、削除処理には注意点があります。削除しようとするデータが存在しない場合や、他のテーブルと関連がある場合にはエラーが発生することがあります。

6-1. 削除リンクの作成

一覧ページに削除用リンクを追加しましょう。ここではGETメソッドでシンプルに削除する方法を紹介しますが、本番環境ではCSRF対策のためにPOSTDELETEメソッドを使うべきです。


<a th:href="@{/users/delete/{id}(id=${user.id})}" onclick="return confirm('本当に削除しますか?');">削除</a>

このようにユーザー一覧の行に削除リンクを追加します。confirmで確認ダイアログを表示することで誤操作を防ぎます。

6-2. コントローラでの削除処理

続いてコントローラで削除処理を行います。deleteById()を使えば簡単に削除可能です。


@GetMapping("/users/delete/{id}")
public String deleteUser(@PathVariable Long id) {
    userRepository.deleteById(id);
    return "redirect:/users";
}

これで指定されたIDのユーザーを削除することができます。

JPA Delete 注意点:
削除対象のデータが存在しない場合、deleteById()はエラーを出さずに無視されます。しかし、外部キー制約などで関連データがある場合、例外が発生する可能性があるため、事前に関連情報のチェックが重要になります。

また、誤って意図しないIDを削除しないように、削除前に確認ダイアログを表示するなど、ユーザーインタフェース側の対策も重要です。

以上で、JPA CRUD 実装の「更新」「削除」機能が完成しました。これらの操作は、ユーザー管理や在庫管理、商品管理など、さまざまなアプリケーションで活用できます。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Spring認証(Spring Security)
Spring BootでCORSを設定する方法を完全解説!初心者でもわかるセキュリティ対策
New2
Spring認証(Spring Security)
パスワードをハッシュ化する理由とは?セキュリティ対策の基本をSpring Securityで学ぼう
New3
SpringのWeb開発(Spring MVC)
HTTPリクエストとレスポンスの基本を完全解説!Spring MVC初心者がWeb通信の仕組みをやさしく理解
New4
Spring認証(Spring Security)
ブラウザからのフォーム送信とは?HTTPリクエストの基礎を初心者向けに解説!
人気記事
No.1
Java&Spring記事人気No1
SpringのWeb開発(Spring MVC)
ルーティングとは?基本概念(Spring MVCのURL制御を理解)
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.3
Java&Spring記事人気No3
Springの基本
application.properties と YAML の基本をやさしく解説!初心者向けSpring Boot設定ファイル入門
No.4
Java&Spring記事人気No4
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.5
Java&Spring記事人気No5
Springの基本
Spring Bootの環境変数の設定方法をやさしく解説!初心者向けapplication.propertiesの使い方
No.6
Java&Spring記事人気No6
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方
No.7
Java&Spring記事人気No7
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.8
Java&Spring記事人気No8
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み