山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

Spring boot で DB 接続する簡単な Web アプリを作成

前回は、Spring boot で Tymeleaf を使用して、簡単な Web アプリを作成しました。

www.shookuro.com

今回は、これに加え DB から取ってきたデータを使用して Tymeleaf で表示してみたいと思います。

接続方法は、JdbcTemplate を使用します。Spring DATA JPA で接続する方法もありますが、JdbcTemplate のほうがシンプルです。簡単なアプリケーションであれば、JdbcTemplate でも十分です。

DB は PostgreSQL 9.5.3 、開発環境は STS 3.9.0 を使用しています。

インストールはこのあたりを参考に。

Spring Tool Suite ( STS )インストール - 山崎屋の技術メモ
WindowsにPostgreSQLをインストール - 山崎屋の技術メモ

DB の準備

name というカラムを1つだけ持つ fruits テーブルを作成しました。

postgres=# \d
           リレーションの一覧
 スキーマ |  名前  |    型    |  所有者
----------+--------+----------+----------
 public   | fruits | テーブル | postgres
(1 行)


postgres=# select * from fruits;
   name
-----------
 apple
 orange
 pineapple
(3 行)

プロジェクトの新規作成

新規作成から「Spring Starter Project」を選択し、次のような感じで設定します。
f:id:yyama1556:20171123104158p:plain


依存関係には「Web」、「Tymeleaf」、「PostgreSQL」、「JDBC」を選択します。
f:id:yyama1556:20171123112138p:plain


こんな感じのプロジェクトが作成されました。
f:id:yyama1556:20171123105006p:plain

DBの接続情報を指定する

application.properties にはさまざまな設定を記述します。Spring boot が勝手に読み込んでくれます。
デフォルトでは、空ファイルになっていますが、次のような記述を追加します。

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=yyama
spring.datasource.password=password

これで、PostgreSQLに接続する準備が整いました。

Tymeleaf テンプレートの作成

resource 配下の templates 配下に次の index.html を配置します。
フルーツテーブルのすべてのレコードの name を表示します。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8" />
    <title>demo</title>
</head>
<body>
<p th:each="fruit : ${fruits}" th:text="${fruit.get('name')}" />
</body>
</html>

コントローラの作成

最後にコントローラを作成します。

ackage org.yyama;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

	@Autowired
	JdbcTemplate jdbcTemplate;
	
	@RequestMapping("/")
	public String index(Model model) {
		List<Map<String,Object>> list;
		list = jdbcTemplate.queryForList("select * from fruits");
		model.addAttribute("fruits", list);
		return "index";
	}
}

JdbcTemplate の変数を宣言し、@Autowired アノテーションを付けると、Spring が 自動でインジェクションしてくれます。

JdbcTemplate の queryForList を使用し、SQL を発行しています。 List<Map<String,Object>> 型の戻り値にテーブルの値がセットされています。

実行

実行したあと、localhost:8080 にアクセスすると、テーブルの値が表示されました。

f:id:yyama1556:20171123115340p:plain

デフォルトでコネクションプールも使用しているよ

JdbcTemplate はデフォルトの設定でもコネクションプールを使用しています。ブラウザからアクセスした後、PostgreSQL の 接続数を確認したら 10 個のコネクションがありました。

postgres=# SELECT * FROM pg_stat_activity;
 datid | datname  | pid  | usesysid | usename  |・・・
-------+----------+------+----------+----------+-・・・
 12373 | postgres | 5208 |    16421 | yyama    |・・・
 12373 | postgres | 3020 |       10 | postgres |・・・
 12373 | postgres | 5324 |       10 | postgres |・・・
 12373 | postgres | 3664 |       10 | postgres |・・・
 12373 | postgres | 4176 |       10 | postgres |・・・
 12373 | postgres | 1196 |       10 | postgres |・・・
 12373 | postgres | 5204 |       10 | postgres |・・・
 12373 | postgres | 1940 |       10 | postgres |・・・
 12373 | postgres | 3492 |       10 | postgres |・・・
 12373 | postgres | 5332 |       10 | postgres |・・・
 12373 | postgres | 6128 |       10 | postgres |・・・
(11 行)

ここらへんの設定をいじりたい場合は、application.properties に次のような記述を追加します。

spring.datasource.tomcat.maxActive=15
spring.datasource.tomcat.maxIdle=10
spring.datasource.tomcat.minIdle=5
spring.datasource.tomcat.initialSize=2

JdbcTemplate は生の JDBC を使いやすくしたくらいの機能かな?と思っていたのですが、結構高機能ですね。無理に JPA など使用しなくても大体の場面では、JdbcTemplate で十分だと思いました。

おしまい。

Spring 関連記事へのリンク集はこちら。
www.shookuro.com

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発