サイトアイコン 知的好奇心

Spring Data REST API(PostgreSQL)を作成する方法

Spring Data REST API(PostgreSQL)を作成する方法をご紹介します。

条件

事前準備

データベース作成

まずは、PostgreSQLにデータベースおよびテーブルを作成します。

以下のコマンドを実行します。

# create database testdb;

作成したデータベースへ切り替え

以下のコマンドで、作成したデータベースに切り替えます。

# \c testdb

テーブル作成

例として以下のようなテーブルを作成します。

create table weather (
    id              serial   primary key,   -- ID
    location_id     int,                    -- 地名ID
    name            varchar(20),            -- 地名
    temperature     int,                    -- 気温
    humidity        int,                    -- 湿度
    date_time       timestamp               -- 日時
);

データ追加

テーブルにデータを追加します。

insert into weather (location_id, name, temperature, humidity, date_time) values 
   (1, '東京', 15, 55, '2019-04-10 09:00:00'),
   (1, '東京', 16, 53, '2019-04-10 10:00:00'),
   (1, '東京', 17, 40, '2019-04-10 11:00:00'),
   (2, '那覇', 20, 65, '2019-04-10 09:00:00'),
   (2, '那覇', 22, 67, '2019-04-10 10:00:00'),
   (2, '那覇', 25, 69, '2019-04-10 11:00:00');

プロジェクトの作成

STSのパッケージエクスプローラーで、右クリック > 新規 > Spring スターター・プロジェクトを選択します。

名前に適当な値(ここではrestJpa)を入力し、次へボタンを押します。

プロジェクトの依存関係で、以下を選択して完了ボタンを押します。

ソース/設定ファイル等

設定ファイルの記述

application.properties

以下の内容を記述します。
(自分の環境に合わせて適宜修正してください)

spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.open-in-view=True

ソースの追加

Weather.java

DBに定義した内容を記述します。

package com.example.demo.entity;

import java.sql.Timestamp;

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


@Entity
public class Weather {
  @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    
    private Integer location_id;
    
    private String name;
    
    private Integer temperature;
    
    private Integer humidity;
    
    private Timestamp date_time;

  public Integer getId() {
    return id;
  }

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

  public Integer getLocation_id() {
    return location_id;
  }

  public void setLocation_id(Integer location_id) {
    this.location_id = location_id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getTemperature() {
    return temperature;
  }

  public void setTemperature(Integer temperature) {
    this.temperature = temperature;
  }

  public Integer getHumidity() {
    return humidity;
  }

  public void setHumidity(Integer humidity) {
    this.humidity = humidity;
  }

  public Timestamp getDate_time() {
    return date_time;
  }

  public void setDate_time(Timestamp date_time) {
    this.date_time = date_time;
  }
}

WeatherRepository.java

インターフェースのみを定義します。

package com.example.demo.repository;

import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.repository.PagingAndSortingRepository;

import com.example.demo.entity.Weather;

@RepositoryRestResource(collectionResourceRel = "weathers", path = "weathers")
public interface WeatherRepository extends PagingAndSortingRepository<Weather, Integer>{

}

パッケージ構成

今回は以下のようなパッケージ構成としました。

実行

プロジェクトを右クリック > 実行 > Spring Bootアプリケーション を選択して実行します。

データ一覧の取得

以下のURLにブラウザでアクセスします。

http://localhost:8080/weathers

データ1件の取得

以下のようにIDを指定したURLにブラウザでします。

http://localhost:8080/weathers/2

データの追加

Postmanを使用してPOSTします。

URLは以下の値を設定します。

http://localhost:8080/weathers

Headersに以下を設定します。

BODYに以下を設定します。
ラジオボタンでrawを選択し、プルダウンでJSONが選択されていることを確認してください。

{
  "location_id" : 3,
  "name" : "横浜",
  "temperature" : 18,
  "humidity" : 77,
  "date_time" : "2021-06-10T11:11:11.000+00:00"
}

Sendボタンを押すと、POSTが実行されます。
成功すると「201 Created」となり以下のような表示となります。

ブラウザでデータ一覧を確認すると、新しくデータが追加されていることがわかります。

データの更新

Postmanを使用してPUTします。

IDは「7」としてレコードが作成されたので、URLは以下の値とします。

http://localhost:8080/weathers/7

HeadersはPOSTの時と同じです。

BODYに以下を設定します。

{
  "location_id" : 3,
  "name" : "横浜update",
  "temperature" : 23,
  "humidity" : 88,
  "date_time" : "2021-06-15T11:11:11.000+00:00"
}

Sendボタンを押すと、PUTが実行されます。
成功すると「200 OK」となり以下のような表示となります。

ブラウザでデータ一覧を確認すると、対象データが更新されていることがわかります。

データの削除

Postmanを使用してDELETEします。

IDは「7」のレコードが対象なので、URLは以下の値とします。

http://localhost:8080/weathers/7

HeadersやBodyに設定は不要です。

Sendボタンを押すと、DELETEが実行されます。
成功すると「204 No Content」となり以下のような表示となります。

ブラウザでデータ一覧を確認すると、対象データが削除されていることがわかります。

以上で、Rest APIを用いたCRUDが出来ることを確認することが出来ました。

Lombokの導入

Lombokを用いて、ソースをすっきりさせたいと思います。

Lombokとは?

アノテーションを付加することで、getter/setter、toString、コンストラクタなどを自動生成してくれるライブラリです。

依存関係の追加

build.gradleのdependenciesに以下を追記します。

build.gradle

以下のようになりました。

plugins {
  id 'org.springframework.boot' version '2.5.0'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-data-rest'
  runtimeOnly 'org.postgresql:postgresql'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
}

test {
  useJUnitPlatform()
}

依存関係の更新

build.gradleを右クリック > Gradle > Gradleプロジェクトのリフレッシュを選択すると、依存関係が更新されます。

LombokのIDE連携

Lombokのjarダウンロード

以下のサイトからjarをダウンロードします。

https://projectlombok.org/download

Lombokのインストール

ダウンロードしたjarをコマンドプロンプトにおいて、以下のコマンドで実行します。

java -jar lombok.jar

するとインストーラが起動します。

インストール対象のSTSが選択されていることを確認し、Install/Updateボタンを押します。

Install successfulという表示になったら、Quit Installerボタンを押して終了します。

インストールの確認

jar

SprintToolSuite4.exeのフォルダ内に以下のjarが追加されています。

iniファイル

SprintToolSuite4.iniに以下のような記述が追加されています。

動作確認

STSを再起動します。

ソース変更

Weather.java

package com.example.demo.entity;

import java.sql.Timestamp;

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

import lombok.Data;

@Data
@Entity
public class Weather {
  @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    
    private Integer location_id;
    
    private String name;
    
    private Integer temperature;
    
    private Integer humidity;
    
    private Timestamp date_time;
}

Ctrol + Oを押して、アウトラインを表示します。

以下が自動で生成されていることがわかります。

Rest APIとしての動作も問題ありません。

参考

Sprint:Spring Data REST API の自動生成 (JPA)

https://spring.pleiades.io/guides/gs/accessing-data-rest/

Qiita:Spring JPA Data with REST と Lombokで恐ろしく簡単にREST APIを作成する。

https://qiita.com/ukiuni@github/items/fb46680146c4cc8b5187

ボイラープレートコードの排除(Lombok)

https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/Appendix/Lombok.html

Qiita:Lombokメモ

https://qiita.com/kuro227/items/3f017bc01a478d9cd139

モバイルバージョンを終了