カテゴリ: Spring 更新日: 2025/10/04

SpringのCrudRepositoryとは?基本のデータベース操作を自動化しよう

CrudRepositoryとは?基本のデータ操作を自動化しよう
CrudRepositoryとは?基本のデータ操作を自動化しよう

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

新人

「Springでデータベースを操作するコードって、毎回SQL書かないといけないんですか?」

先輩

「実はSpringには、SQLを書かなくても基本的なデータ操作ができる便利な仕組みがあるんだよ。それがCrudRepositoryだ。」

新人

「CrudRepositoryって、どういうものなんですか?」

先輩

「Springのデータアクセスの仕組みの一部で、エンティティと呼ばれるクラスを元に、自動でデータベースとやり取りしてくれるインターフェースなんだ。詳しく説明するね。」

1. CrudRepositoryとは何か?Springにおける位置づけ

1. CrudRepositoryとは何か?Springにおける位置づけ
1. CrudRepositoryとは何か?Springにおける位置づけ

CrudRepositoryとは、Spring Data JPAが提供するインターフェースの一つで、リレーショナルデータベースに対して基本的なCRUD(Create, Read, Update, Delete)操作を簡単に行うための仕組みです。

通常、データベース操作を行うにはSQLを直接書いたり、JDBCを使って細かくコードを書く必要があります。しかし、Springフレームワークでは、CrudRepositoryを使うことで、SQLを一切書かずにデータ操作が可能になります。

CrudRepositoryは、次のような特徴があります:

  • エンティティクラスに対応したリポジトリを簡単に作成できる
  • メソッドを定義するだけで、Springが裏側で自動的にSQLを生成・実行してくれる
  • Spring Bootと連携することで設定も最小限にでき、学習コストも低い

初心者でも扱いやすく、企業の業務システムでも広く使われている信頼性の高い技術です。Springでデータベース操作を始めるなら、まずはCrudRepositoryの使い方から学ぶのが王道といえます。

2. CrudRepositoryで自動化できる基本操作とは?

2. CrudRepositoryで自動化できる基本操作とは?
2. CrudRepositoryで自動化できる基本操作とは?

新人

「CrudRepositoryを使うと、具体的にどんなことが自動でできるんですか?」

先輩

「良いところに気がついたね。例えば、データの登録・取得・更新・削除といった、基本的な操作がすべて自動化されるんだ。」

新人

「登録や取得もですか?SQL文書かなくても?」

先輩

「うん。例えばsave()というメソッドを呼ぶだけで、データの保存や更新ができる。findAll()で全件取得、findById()で特定のIDのデータ取得、deleteById()で削除、といった具合に、メソッド名だけで全部できるよ。」

CrudRepositoryが提供する代表的なメソッドには以下のようなものがあります:

  • save(S entity):エンティティを保存(INSERTやUPDATE)
  • findById(ID id):IDを指定して1件取得
  • findAll():全件取得
  • deleteById(ID id):IDを指定して削除
  • delete(T entity):エンティティを指定して削除
  • count():レコード件数を取得
  • existsById(ID id):指定IDのレコードが存在するかを確認

つまり、開発者はSQLを一切書かずに、データベースとやり取りできるというのが最大の魅力です。
実際のプロジェクトでは、例えば「社員一覧を表示したい」といった要件に対して、findAll()を呼び出すだけで済みます。

また、Spring Bootと組み合わせることで、Gradleで依存関係を追加し、簡単にこのCrudRepositoryをプロジェクトに導入できます。
Pleiades環境でもSpring Bootプロジェクトの作成時に「Spring Data JPA」を選ぶだけで、準備が整います。

新人

「なるほど、メソッド名だけで操作できるのはすごく便利ですね。最初に覚えるのにぴったりかも!」

先輩

「そのとおり!Springでデータベース操作を覚えるなら、CrudRepositoryを使いこなすのが最初のステップだよ。」

3. CrudRepositoryを使ったデータ登録の方法(saveメソッド)

3. CrudRepositoryを使ったデータ登録の方法(saveメソッド)
3. CrudRepositoryを使ったデータ登録の方法(saveメソッド)

新人

「先輩、実際にデータを登録するにはどうすればいいんですか?」

先輩

「いい質問だね。SpringのCrudRepositoryを使えば、save()というメソッドを呼ぶだけで、データベースに保存できるよ。」

新人

「saveって、英語の『保存する』って意味のあのsaveですか?」

先輩

「その通り!エンティティクラスのオブジェクトをそのまま渡すだけで、自動的にINSERT文が実行されるんだ。」

Springでデータを保存するには、エンティティクラス(たとえば「Book」クラス)のインスタンスを作成して、save()メソッドに渡すだけです。
SQL文を書く必要はありません。Springが自動的にデータベースに保存してくれます。
これは「CrudRepositoryの使い方」の中でも、特に覚えておきたい基本機能です。


@Controller
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    @PostMapping("/add")
    public String addBook(@ModelAttribute Book book) {
        bookRepository.save(book);
        return "redirect:/list";
    }
}

上記の例では、フォームから送信された本の情報を@ModelAttributeで受け取り、それをそのままsave()で保存しています。
GradleでSpring BootとSpring Data JPAを導入していれば、Pleiades環境でもこのまま動作します。

4. データ取得や削除の使い方(findById、findAll、deleteById)

4. データ取得や削除の使い方(findById、findAll、deleteById)
4. データ取得や削除の使い方(findById、findAll、deleteById)

Springでデータ取得の例」としてよく使われるのが、findAll()findById()です。これらのメソッドは、名前の通り「すべて取得」と「IDで取得」の機能を持っています。

一覧表示などではfindAll()を使い、詳細画面ではfindById()を使うというパターンが一般的です。また、削除はdeleteById()を使います。


@GetMapping("/list")
public String showList(Model model) {
    Iterable<Book> books = bookRepository.findAll();
    model.addAttribute("books", books);
    return "book-list";
}

@GetMapping("/detail/{id}")
public String showDetail(@PathVariable Long id, Model model) {
    Book book = bookRepository.findById(id).orElse(null);
    model.addAttribute("book", book);
    return "book-detail";
}

@GetMapping("/delete/{id}")
public String deleteBook(@PathVariable Long id) {
    bookRepository.deleteById(id);
    return "redirect:/list";
}

データ取得の例としてfindAll()を使えば、全レコードを取得できます。
findById()はOptional型で返ってくるので、orElse(null)などでnull対応をしておくと安全です。
deleteById()を使えば、指定されたIDのデータを簡単に削除できます。

こうした基本操作をわずか数行で実現できるのがCrudRepositoryの魅力です。
まさに「データ操作の自動化」と呼ぶにふさわしい仕組みです。

5. 簡単なエンティティクラスとリポジトリの作成例

5. 簡単なエンティティクラスとリポジトリの作成例
5. 簡単なエンティティクラスとリポジトリの作成例

ここでは、CrudRepositoryの使い方を具体的に理解するために、簡単なエンティティクラスとリポジトリインターフェースの例を紹介します。

Spring Bootを使ったGradleプロジェクトで、Pleiades環境にて開発している前提です。依存関係はPleiadesのチェックボックスから「Spring Data JPA」「Spring Web」「H2 Database」などを追加しておきましょう。

Bookエンティティの例


package com.example.demo.model;

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

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String author;

    // ゲッターとセッター
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

BookRepositoryの例


package com.example.demo.repository;

import com.example.demo.model.Book;
import org.springframework.data.repository.CrudRepository;

public interface BookRepository extends CrudRepository<Book, Long> {
}

これだけで、Springでデータ保存データ取得の例・削除までが一通り実装できます。
あとは@Controllerを使って、画面からデータをやり取りするだけです。

新人

「クラスとインターフェースを用意するだけで、ここまでできるんですね!」

先輩

「そうだよ。SpringのCrudRepositoryを使えば、データベース操作が驚くほど簡単になるんだ。覚えておいて損はないよ!」

6. 簡単な画面と連携する例(フォームからデータを保存)

6. 簡単な画面と連携する例(フォームからデータを保存)
6. 簡単な画面と連携する例(フォームからデータを保存)

ここでは、Springの@ControllerCrudRepositoryを使って、フォームから入力されたデータを保存する方法を解説します。
Pleiades環境で作成したGradleプロジェクトで、HTMLフォームから送信されたデータをエンティティとして受け取り、データベースへ自動で保存する構成です。

フォームのHTMLは割愛しますが、name属性に「title」と「author」があるテキストフィールドを用意している想定です。
Spring 入門の方にも分かりやすいように、サーバー側の処理の流れだけを重点的に説明します。


@Controller
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    @GetMapping("/form")
    public String showForm(Model model) {
        model.addAttribute("book", new Book());
        return "book-form";
    }

    @PostMapping("/submit")
    public String submitForm(@ModelAttribute Book book) {
        bookRepository.save(book);
        return "redirect:/list";
    }
}

上記の例では、GET /formで入力画面を表示し、POST /submitでフォームの内容を受け取ってデータベースに保存しています。
こうした実装を通じて、データ保存 自動化の恩恵を感じられるはずです。

7. CrudRepositoryを使うと開発がどう楽になるのか(メリット)

7. CrudRepositoryを使うと開発がどう楽になるのか(メリット)
7. CrudRepositoryを使うと開発がどう楽になるのか(メリット)

SpringのCrudRepositoryを使う最大のメリットは、「面倒なSQLを書かずに済む」という点です。
これは小さなアプリケーションでも大きな業務システムでも同じで、開発スピードの向上バグの減少に直結します。

他にも、次のようなメリットがあります:

  • コードが簡潔で見やすくなる
  • 共通処理を自動で提供してくれるため、開発工数が減る
  • データベース操作に関するミスを減らせる
  • Spring Bootと組み合わせれば設定も最小限

特に、Spring 入門者にとっては、「どうやってSQLを書くのか」に悩む必要がない点が安心です。
また、チーム開発においても共通の命名規則に沿ってコードを記述できるため、保守性も高くなります。

「登録はsave()」「一覧はfindAll()」「削除はdeleteById()」といったように、シンプルな構成であらゆる処理が完了するのは、非常に強力な武器です。

8. よくあるエラーや注意点(nullチェック、Optionalの使い方など)

8. よくあるエラーや注意点(nullチェック、Optionalの使い方など)
8. よくあるエラーや注意点(nullチェック、Optionalの使い方など)

SpringでCrudRepositoryを使っていると、初心者がよくつまずくポイントがあります。ここでは、CrudRepository エラー対策として、いくつかの注意点を紹介します。

1. findByIdの戻り値はOptional型

findById()Optional型で値を返します。これは「値が存在するかもしれないし、しないかもしれない」というときに使う型です。


@GetMapping("/detail/{id}")
public String showDetail(@PathVariable Long id, Model model) {
    Optional<Book> optionalBook = bookRepository.findById(id);
    if (optionalBook.isPresent()) {
        model.addAttribute("book", optionalBook.get());
    } else {
        model.addAttribute("error", "データが見つかりませんでした");
    }
    return "book-detail";
}

optional.get()を使う前に、必ずisPresent()で存在確認を行うようにしましょう。
これを怠ると、NoSuchElementExceptionが発生し、アプリが落ちてしまいます。

2. nullや空文字の扱いに注意

入力フォームから渡ってくる値が空文字やnullになることがあります。
そのまま保存すると、バリデーションエラーやデータ不整合の原因になることもあるため、事前にチェックを入れることが重要です。


@PostMapping("/submit")
public String submitBook(@ModelAttribute Book book, Model model) {
    if (book.getTitle() == null || book.getTitle().isEmpty()) {
        model.addAttribute("error", "タイトルは必須です");
        return "book-form";
    }
    bookRepository.save(book);
    return "redirect:/list";
}

このように、手動で入力値の検証を行うことで、Spring 入門者でも堅牢なコードを書くことができます。

3. deleteByIdで存在しないIDを指定すると?

deleteById()を使う際、指定したIDが存在しない場合でも、例外は発生せずスルーされる仕様です。
ただし、削除したつもりで実は何も削除されていなかった、というトラブルの原因になります。

安全のためには、削除前にexistsById()で存在確認をしておくと安心です。


@GetMapping("/delete/{id}")
public String deleteBook(@PathVariable Long id, Model model) {
    if (bookRepository.existsById(id)) {
        bookRepository.deleteById(id);
    } else {
        model.addAttribute("error", "指定されたIDは存在しません");
    }
    return "redirect:/list";
}

このように、CrudRepository エラー対策として「Optionalの扱い方」や「nullチェック」は非常に大切なポイントです。
しっかり対策をしておくことで、トラブルを未然に防ぎ、安定したアプリケーションを作ることができます。

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

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

カテゴリの一覧へ
新着記事
Java はなぜオブジェクト指向なの?その理由とメリットを初心者向けにやさしく解説
オブジェクト指向とは?初心者向けにやさしく解説【Java入門】
Java の複数の引数を扱う方法を完全ガイド!カンマで区切る基本を初心者向けに解説
Java の void メソッドとは?戻り値がない場合の使い方を初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
SQLのINSERT文を完全ガイド!初心者でもわかるデータの追加方法
No.2
Java&Spring記事人気No2
Modelとは?メソッド引数のModelの使い方を初心者向けに解説!
No.3
Java&Spring記事人気No3
SQLのサブクエリを完全ガイド!入れ子クエリの使い方を初心者向け解説
No.4
Java&Spring記事人気No4
HTMLのセレクトボックス(プルダウン)の使い方を完全ガイド!selectとoptionの基本を覚えよう