Skip to content
Playground

演習: MVC

この章では、タスクをデータベースに保存できるようにし、一覧をそこから取得します。T- はタスク管理アプリ tasks の問題です。

T-5. tasks データベースとテーブルの作成

Section titled “T-5. tasks データベースとテーブルの作成”

タスクを保存するデータベースとテーブルを SQL で用意します。次のとおり作ります。

  • データベース名は tasks
  • その中に、次の列を持つ tasks テーブルを作る
    • id:各行を区別する連番の主キー(AUTO_INCREMENT
    • title:タスク名(VARCHAR、空を許さない)
    • completed:完了したかどうか(真偽値の BOOLEAN、既定は未完了)
    • notes:メモ(TEXT
  • 初期データとして次の 3 件を入れる。notes は空でよい
    • 資料を作成する(未完了)
    • メールを返信する(完了)
    • 会議の準備をする(未完了)

SELECT * FROM tasks; で 3 行が返れば成功です。

ヒント

CREATE TABLE主キーAUTO_INCREMENT は、データベース研修で扱ったとおりです。BOOLEAN代表的なデータ型 の表にはありませんが、truefalse を保存する型で、MySQL では 01 として扱われます。

CREATE DATABASE tasks;
USE tasks;
CREATE TABLE tasks (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
completed BOOLEAN NOT NULL DEFAULT FALSE,
notes TEXT
);
INSERT INTO tasks (title, completed, notes) VALUES
('資料を作成する', FALSE, ''),
('メールを返信する', TRUE, ''),
('会議の準備をする', FALSE, '');

T-6. データベースからのタスク一覧

Section titled “T-6. データベースからのタスク一覧”

T-3 では /tasks の一覧を固定の List<Task> から表示しました。これを、T-5 で作った tasks テーブルから取得する形に変えます。本文 データアクセスの分離 と同じく、JDBC の処理はコントローラーに書かず、TaskRepository に分けます。

TaskRepository

データアクセスを担う TaskRepository を次のとおり定義します。

  • tasks データベースに JDBC で接続する(jdbc:mysql://127.0.0.1:3307/tasks、ユーザー root、パスワード root
  • findAll()SELECT title, completed, notes FROM tasks を実行し、1 行ずつ Task に変換して List<Task> で返す
  • 接続の取得・解放、ResultSet の読み取り、SQLException の処理は、本文の BookRepository と同じ形にする

コントローラー

  • TasksController/tasks で、固定リストの代わりに new TaskRepository().findAll() の結果を Model に渡す
  • application.propertiesspring.autoconfigure.exclude=...DataSourceAutoConfiguration の行はそのまま残す(DataSource はまだ使わない)
  • POST /tasks の保存は次章で実装する。この章は一覧の取得元を変えるところまで

データベースで INSERTDELETE を実行してから /tasks を開き直すと、変更が一覧に反映されることを確かめます。

完成イメージ(tasks テーブルの 3 件):

ヒント

TaskRepositoryfindAll() は、本文 データアクセスの分離BookRepository をなぞります。DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/tasks", "root", "root") で接続し、try-with-resourcesConnectionPreparedStatementResultSet を扱い、SQLExceptioncatch して RuntimeException で投げ直します。

completedboolean なので行からは rs.getBoolean("completed") で取り出し、new Task(rs.getString("title"), rs.getBoolean("completed"), rs.getString("notes"))Task を作ります。

TasksControllernew TaskRepository() を持ち、/taskstaskRepository.findAll()Model に渡します。表示する tasks.htmlT-3 のままで変わりません。