MENU

[Java 初心者学習] Spring Data JPAを用いたDB操作 – 0012

実際の開発でかかせないのが、DB操作です。それは Java (Spring Boot) での開発でも同様です。今回はDB操作について、簡単にお伝えします。

目次

Spring Data JPAを使ったDB操作

Spring Boot でのDB操作では、Spring Data JPA という仕組みが主流です。これは ORマッパー (Object-Relational Mapper) と呼ばれる技術のひとつになります。これは Java のオブジェクトとDBのテーブルをアノテーションで直結し、SQLを1行も書かずにデータの保存や検索を完結させる仕組みです。以下の3つがDB連携を支えています。

エンティティ
(Entity)
DBの「テーブル」そのものを表現するJavaクラスです。 クラスの上に @Entity、主キーとなるフィールドの上に @Id というアノテーションを付与するだけで、Spring Bootが「あ、このクラスはDBのあのテーブルと連動しているんだな」と自動的に認識します
リポジトリ
(Repository)
データの検索や保存を行うための窓口です。開発者はインターフェースを定義するだけで、実装クラスを書く必要がありません。リポジトリの例は以下の通りです。
H2 Database 学習やローカル開発では H2 Database というJava製の軽量DBを使います。
・PCへのインストール作業が一切不要 (pom.xml に一行書くだけ)
・アプリを起動すると、PCのメモリ上に自動でDBが立ち上がり、アプリを止めると綺麗に消える
・ブラウザからDBの中身を覗ける便利な管理画面 (H2 Console) が最初から内蔵されている。
// インターフェースを宣言するだけ。中身のコードはSpringが自動生成します!
public interface UserRepository extends JpaRepository<User, String> {
    // これだけで、保存(save)、全件取得(findAll)、ID検索(findById)が最初から使えます。
}

実務では H2 Database ではなく PostgreSQL や MySQL などを利用します。

処理の流れ

画面から受け取ったユーザーデータをDBに保存したい場合はこれだけで完結します。

// コントローラーでの利用イメージ
@Autowired
private UserRepository userRepository; // リポジトリをDI(注入)してもらう

@PostMapping("/register")
public String registerUser(User user) {
    // 1行書くだけで、Springが裏側で「INSERT INTO ...」というSQLを自動生成して実行します
    userRepository.save(user); 
    return "success";
}

手動での接続管理 (close 処理) や、面倒な詰め替え作業、SQL文の記述すら必要ありません。すべてフレームワークが安全に肩代わりしてくれます。

実装手順

ここでは、簡易的な商品管理をテーマにDB連携の仕組みを組み立てていきます。手順は以下の通りです。

  1. pom.xml にライブラリ追加
  2. データベースの設定記述
  3. テーブルの元となるエンティティ作成
  4. DB操作用のリポジトリ作成
  5. 制御するためのコントローラー作成

また、以下リンクの Spring Boot 設定を実施済みの上での説明となります。詳細はリンクより別記事をご確認ください。

pom.xml にライブラリ追加

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
    </dependency>

pom.xml の <dependencies> の中に上記2つの記述を追記して保存してください。

  • Spring Data JPA
  • H2 Database

プロジェクトを右クリックし、[Maven] -> [プロジェクトの更新…] を実行してライブラリを完全に同期させてください。

データベースの設定記述

Spring Bootに、H2 Databaseを使用することと、ブラウザからDBの中身を確認するための管理画面 (H2 Console) を有効にする設定を伝えます。

# H2データベースへの接続設定(メモリ上に「testdb」という名前のDBを作成)
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver

# H2の管理画面(Console)を有効化し、パスを「/h2-console」にする設定
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

src/main/resources/application.properties を開き、上記内容を追記してください。

テーブルの元となるエンティティ作成

DBのテーブル構造を定義するJavaクラスを作成します。

package com.example.demo;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity // このクラスがDBのテーブルとマッピングされることを示します
public class Task {

    @Id // このフィールドが主キー(プライマリキー)であることを示します
    private String id;
    private String title;

    // JPAの仕様上、引数なしのデフォルトコンストラクタが必須となります
    public Task() {}

    // データ登録時に使用するコンストラクタ
    public Task(String id, String title) {
        this.id = id;
        this.title = title;
    }

    // ゲッターメソッド
    public String getId() { return id; }
    public String getTitle() { return title; }
}

com.example.demo パッケージの中に、新しく Task.java というクラスを作成し、以下のコードを記述してください。

DB操作用のリポジトリ作成

データの保存や検索を行うためのインターフェースを作成します。

package com.example.demo;

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

@Repository
// JpaRepository<扱うエンティティの型, 主キーの型> を継承します
public interface TaskRepository extends JpaRepository<Task, String> {
    // 枠組みを定義するだけで、標準的なCRUD処理のメソッドが自動的に利用可能になります
}

com.example.demo パッケージの中に、新しく TaskRepository.java というファイルをインターフェースとして作成し、上記コードを記述してください。

制御するためのコントローラー作成

実際にリポジトリを呼び出して、データの登録と取得を行うURLの窓口を作ります。

package com.example.demo;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TaskController {

    @Autowired
    private TaskRepository taskRepository; // 引数なしで自動的にインスタンスが注入されます

    // タスクを登録するURL(例:/add?title=買い物)
    @GetMapping("/add")
    public String addTask(@RequestParam(name = "title") String title) {
        var id = "T" + (System.currentTimeMillis() % 1000);
        var task = new Task(id, title);
        
        taskRepository.save(task); // DBへのINSERT文が自動的に実行されます
        return "タスクを登録しました: " + title;
    }

    // 登録されたタスクを全件取得してJSONで返すURL
    @GetMapping("/tasks")
    public List<Task> getTasks() {
        return taskRepository.findAll(); // DBからのSELECT文が自動的に実行されます
    }
}

com.example.demo パッケージの中に、新しく TaskController.java というクラスを作成し、上記コードを記述してください。

起動と動作確認

DemoApplication.java を [実行] -> [Java アプリケーション] で起動します。

起動時のログに HHH000412: Hibernate ORM core version… などのJPA関連のログが出力されることを確認してください。また、JPAの自動機能により、Task クラスの構造を元にした task テーブルがDB内に自動生成されます

ブラウザを開き、まずは以下のURLにアクセスしてください。

登録後、以下の全件取得URLにアクセスします。画面に、登録したデータが上記のようなJSON配列の形式で出力されれば、DBへの保存と取得の処理が正常に動作しています。

http://localhost:8080/tasks

この流れで、手動でのSQL記述や接続管理を行うことなく、クラスの定義とインターフェースの継承のみでDB操作が完結する構造が確認できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次