Java

【Spring Boot】PostgreSQLに接続してデータを取得する

uhablog

こんにちは、大学時代にプログラミングの勉強を始め現在はエンジニアをしているuhablogです。
当ブログでは現役エンジニアがプログラミング初学者の方向けにプログラミングの学習法を発信しています。

uhablogではSpring Bootで簡単なWebアプリを開発する方法を発信しています。

Javaの基礎学習が終わった方へ

今回の記事ではSpring Bootを使ってPostgreSQLに接続してテーブルからデータを取得する方法を解説していきます。

この記事を実際に手順通りに進めていただくことで

  1. PostgreSQLでデータベース・テーブルを作成する方法
  2. Spring BootでPostgreSQLに接続する方法
  3. 実際にデータを取得して、画面に表示する方法

を学習することができます!

少し長くて、大変かもしれませんが、その分内容も濃くてこの記事のことを実践するだけでSpringBootで実際にWebアプリを開発する第一歩を歩むことができます!ぜひチャレンジしてみてください。

\\今ならセール開催中!//

UdemyでSpring Bootを学ぶ!!

返金保証付き

PostgreSQLでデータベース・テーブルの作成

まず最初にPostgreSQLでデータベースとテーブルの作成を行います。

データベースの作成

次のコマンドをターミナル等で実行して、データベースを作成します。

createdb SpringTestDB -O username

usernameの箇所はご自身の環境に応じて、変更してください。

PostgreSQLでのユーザーの確認方法

ターミナルで以下のコマンドを実行してPostgreSQLに接続します。

psql -d postgres

接続に成功するとターミナルの先頭が「postgres=#」となります。

接続したら以下のSQLでユーザーの一覧を確認することができます。

select usename from pg_user;

テーブルの作成

データベースの作成が完了したら、テーブルを作成します。

次のコマンドで、作成したデータベースに接続しょう。

ターミナルの先頭が「SpringTestDB=>」となっていたら接続成功です。

psql -U username SpringTestDB

usernameの箇所は先ほどデータベースの作成に使用したユーザーと同じものを指定してください。

次のコマンドでテーブルを作成します。

create table booksinfo(id serial, title varchar(50), price int);

今回はbooksinfoというテーブルを作成しました。
このテーブルは次のようなカラムを持ちます。

  • 自動で番号が付けられるid
  • 本のタイトル
  • 本の値段

このbooksinfoにデータをいくつか登録しておきます。

insert into booksinfo(title,price) values ('渋谷ではたらく社長の告白', 800),('起業家', 800), ('藤田晋の成長論', 1540);

select文を実行して、データが登録されているか確認します。

select * from booksinfo;

次のようにデータが登録されていたらPostgreSQLでのDBとテーブルの作成は完了です。

idtitleprice
1渋谷ではたらく社長の告白800
2起業家800
3藤田晋の成長論1540

まずはPostgreSQLでテーブルを作成する!

Spring Bootの設定を変更

次にSpring BootでPostgreSQLに接続するための設定を行なっていきます。

Eclipseを使って、Spring Bootの環境構築する方法はこちらの記事を参考にしてみてください。

Eclipseで環境構築

application.propertiesの変更

まず「src/main/resources」の中のapplication.propertiesにDBに接続するための記述を行います。

spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/SpringTestDB
spring.datasource.username=username
spring.datasource.password=password

「username」は先ほどのデータベースを作成した時のユーザー、パスワードはそのユーザーのパスワードです。

pom.xmlに依存関係の追加

pom.xmlの<dependencies>と</dependencies>の間に次のような記述を追加します。

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

PostgreSQLのデータを表示するプログラム

では実際にプログラムを書いて、PostgreSQLからデータを取得してみましょう。

最終的なフォルダ・ファイル構成は次のようになります(一部この記事では作成しないファイルも含まれています)。

modelの作成

最初にmodelクラスを作成します。

modelクラスは、データベースのデータを格納するためのクラスです。

modelパッケージ(modelフォルダ)にBook.javaを作成します。

Book.java

package com.uhablog.model;

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

import lombok.Data;

@Data
@Entity
@Table(name = "booksinfo")
public class Book {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    // 本のidを保持するフィールド
    private Integer id;
	
    @Column(name="title")
    // 本のタイトルを保持するフィールド
    private String title;
	
	
    @Column(name="price")
    // 本の値段を保持するフィールド
    private Integer price;
}

Bookクラスは先ほどPostgreSQLに作成したbooksinfoテーブルのデータを保持する役割を持っています。

そのためbooksinfoテーブルのカラムと同じid, title, priceの3つのフィールドを持ちます。

またいくつかのアノテーションについて簡単に説明します。

  • @Tableは対応するテーブルを設定
  • @Dataで各フィールドのsetterとgetterを自動で生成
  • @GeneratedValueでidが自動で生成される値であることを明示
  • @Columnでテーブルのどのカラムと対応しているか設定

modelクラスはテーブルのデータを保持する役割を持つ

repositoryの作成

次にrepositoryインターフェースを作成します。

repositoryは実際にデータベースとのやり取りをするためのインターフェースです。

repositoryパッケージにBookRepository.javaを作成します。

BookRepository.java

package com.uhablog.repository;

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

import com.uhablog.model.Book;

public interface BookRepository extends JpaRepository<Book, Integer> {

}

BookRepositoryではJpaRepositoryインターフェースを継承しています。

JpaRepositoryインターフェースを継承することで、以下のような基本的なデータの取得するメソッドを自動で作成してくれます。

  • データの取得
  • データの挿入
  • データの更新
  • データの削除

また今回は先ほど作成したBookクラスを操作するためのRepositoryを作成するため、JpaRepository<Book, Integer>としています。

IntegerはBookクラスのIdの型を指定しています。

JpaRepositoryを継承して、データベースを操作するインターフェースを作成する

serviceの作成

次にserviceクラスを作成します。

serviceはこの後作るcontrollerとrepositoryの橋渡し役のような役割です。

コントローラーでリクエストを受け取り、サービスクラスでデータベースとのやり取りや、処理を行なっていきます。

serviceパッケージにBookService.javaを作成します。

BookService.java

package com.uhablog.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.uhablog.model.Book;
import com.uhablog.repository.BookRepository;

@Service
@Transactional
public class BookService {
	
    @Autowired
    BookRepository repository;
	
    /**
     * データベースから本の一覧を取得する
     * @return
     */
    public List<Book> findAll() {
        return repository.findAll();
    }
}

今回、サービスクラスの中にはデータベースに登録されている本を全件取得するメソッドを作成します。

@Autowiredで先ほど作成したBookRepositoryのインスタンスを保持します。

findAllメソッドの中でBookRepositoryのインスタンスを使って、データベースからデータを取得し返却します。

serviceクラスはcontrollerとrepositoryの橋渡し役的存在!

contorollerの作成

次にcontorollerクラスを作成します。

contorollerではユーザーからリクエストを受け取り、リクエストの内容に従ってサービスクラスを呼び出します。

サービスクラスから結果を受け取り、その結果をレスポンスとしてユーザーに返却します。

controllerパッケージにBookController.javaを作成します。

BookController.java

package com.uhablog.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.uhablog.model.Book;
import com.uhablog.service.BookService;

@Controller
public class BookController {
	
    @Autowired
    BookService service;
	
    @GetMapping("/book-list")
    public String bookList(Model model) {
		
        // serviceを使って、本の一覧をDBから取得する
        List<Book> bookList = service.findAll();
        // modelに本の一覧を設定して、画面に渡す
        model.addAttribute("bookList", bookList);
        // bookList.htmlの表示
        return "bookList";
    }
}

まずアノテーションについて解説します。

  • @Controllerでコントローラーであることを宣言
  • @AutowiredでBookServiceのインスタンスを保持
  • @GetMappingで「/book-list」にリクエストが来たときにbookListメソッドが実行

bookListメソッドではサービスクラスを使って、データベースからデータを取得し、modelに結果を格納しています。

modelに設定することで、画面でも結果を参照することが可能になります。

最後に「return "bookList"」でbookList.htmlを画面に表示することができます。

controllerではリクエストを受け取り、サービスクラスを使って、処理をした結果をユーザーに返却する

bookList.htmlの作成

最後にhtmlを作成します。

htmlではコントローラから渡された結果を画面に表示します。

「src/main/resources」の中のtemplatesにbookList.htmlを作成します。

bookList.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>本の一覧表示</title>
</head>
<body>
    <table>
        <tr th:each="book : ${bookList}" th:object="${book}">
            <td th:text="*{id}"></td>
            <td th:text="*{title}"></td>
            <td th:text="*{price}"></td>
        </tr>
    </table>
</body>
</html>

bookList.htmlの中では「<html xmlns:th="http://www.thymeleaf.org">」と宣言していて、thymeleafというテンプレートエンジンを使うことができます。

thymeleafを使うことでhtmlのなかにJavaっぽいコードを書くことができるようになります。

今回はtableタグの中でcontrollerから受け取ったbookListをループさせて、画面に表示しています。

動作確認

最後に動作確認をします。

Eclipseでプロジェクトを右クリックして、「実行」→「Spring Boot アプリケーション」をクリックします。

アプリを起動して「http://localhost:8080/book-list」にアクセスします。

テーブルからデータを取得できていることがわかります!

次の記事はこちら!!

\\今ならセール開催中!//

UdemyでSpring Bootを学ぶ!!

返金保証付き

プログラミング学習はUdemyがおすすめ

私はプログラミングの学習はUdemyで行うのが一番おすすめです。
Udemyでは動画講座でプログラミングなどのスキルを身につけることができます。
現役エンジニアがUdemyをオススメする理由は
・動画で好きなときに学べる
・一流の講師に学ぶことができる
・講師の方に質問ができる
・返金保証もある
・セールを頻繁に開催している
といったたくさんの理由があります。

現在Udemyではセールを開催しています!
通常時1万円から2万円前後の価格で講座が販売されていますが、セール時には1500円前後(ランチ代くらい)で一つの講座を購入することができます。
UdemyにはSpring BootでWebアプリの開発を学べる講座iconもあるので、Javaの基礎を動画で学んでみたい!という方はチェックしてみてください。

独学が不安な人へ

独学で学んでいく意志がある方にはUdemyなどで学習するのがおすすめですが、プログラミングを独学するにはそれなりにハードルがあります。

  • プログラミングで一度挫折した経験がある
  • 一人で学習する自信がないので、サポートが欲しい

という方にはプログラミングスクールを検討してみるのがおすすめです。

-Java
-, , , ,