エンジニア大学ではSpring Bootで簡単なWebアプリを開発する方法を発信しています。
Javaの基礎学習が終わった方へ
・Spring BootでWebアプリを開発する
・EclipseでSpring Bootの環境を構築する・・・・・・前回の記事
・GitHubに全コード上がっています!
今回の記事ではSpring Bootを使ってPostgreSQLに接続してテーブルからデータを取得する方法を解説していきます。
この記事を実際に手順通りに進めていただくことで
- PostgreSQLでデータベース・テーブルを作成する方法
- Spring BootでPostgreSQLに接続する方法
- 実際にデータベースからデータを取得して、画面に表示する方法
を学習することができます!
少し長くて、大変かもしれませんが、その分内容も濃い記事となっています!
この記事を実践して、Webアプリを開発する第一歩を踏み出してみて下さい!
転職活動をして年収を伸ばそう!
PostgreSQLでデータベース・テーブルの作成
まず最初にPostgreSQLでデータベースとテーブルの作成を行います。
PostgreSQLでデータベースとテーブルを作る2STEP
- データベースの作成
- テーブルの作成
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とテーブルの作成は完了です。
id | title | price |
---|---|---|
1 | 渋谷ではたらく社長の告白 | 800 |
2 | 起業家 | 800 |
3 | 藤田晋の成長論 | 1540 |
まずはPostgreSQLでテーブルを作成する!
Spring Bootの設定を変更
次にSpring BootでPostgreSQLに接続するための設定を行なっていきます。
Eclipseを使って、Spring Bootの環境構築する方法はこちらの記事を参考にしてみてください。
SpringBootでPostgreSQLを使うためには次の2つの設定が必要です。
- application.propertiesの変更
- pom.xmlに依存関係の追加
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」は先ほどのデータベースを作成した時のユーザー、「password」はそのユーザーのパスワードに変更してください。
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からデータを取得してみましょう。
ここでは5つのファイルを作成します。
- Book.java(model)の作成
- BookRepository.java(repository)の作成
- BookService.java(service)の作成
- BookController.java(controller)の作成
- bookList.html(html)の作成
最終的なフォルダ・ファイル構成は次のようになります(一部この記事では作成しないファイルも含まれています)。
Book.java(model)の作成
最初にmodelクラスを作成します。
modelクラスは、データベースのデータをJavaのクラスとして扱うために必要です。
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クラスはテーブルのデータを保持する役割を持つ
BookRepository.java(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を継承して、データベースを操作するインターフェースを作成する
BookService.java(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の橋渡し役的存在!
BookController.java(controller)の作成
次に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を作成します。
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」にアクセスします。
テーブルからデータを取得できていることがわかります!
次の記事ではBootstrapというCSSのフレームワークを使って、画面の見た目をきれいに整えていきます。
Bootstrapを使うことで、簡単にきれいな見た目を作ることができ、アプリ開発のモチベーションアップにつながります!
ぜひチャレンジしてみてください。
挫折せずにプログラミングを学ぶためには?
僕はプログラミングで挫折した経験があります。
エラーの連続やエラーが解消しても思った通りに動かないといったことが原因で、プログラミングが嫌いでした。
当時はパソコンの基礎すら分からず、Googleでの検索力もありませんでした。
「プログラミングって全然意味わからないし、全然楽しくない」そう思っていました。
そんな僕でも今はエンジニアとして働けています。
エンジニアとなった今、初心者の方は周りの人に聞ける環境というのがとても大切だと感じています。
周りに聞ける人がいない時は、学習環境を手に入れるためにお金を払うというのも一つの方法です。
それができるのが、プログラミングスクールのFreeksです。
Freeksは月額10,780円で現役エンジニアに質問する環境を手に入れることができるプログラミングスクールです。
多くのプログラミングスクールが数十万円払って通うところを月額10,780円から通うことができるのはコスパが良いです。
しかもサブスク制で、自分のペースで学ぶことができ嫌になったらすぐにやめることができます。
Freeksでは無料カウンセリングを行なっています。
「周りに誰も聞ける人がいなくて、エラーが解決できない」「プログラミング全然楽しくない」という方は、無料カウンセリングを受けてみて下さい。
【関連記事】Freeks評判、口コミ