演習: 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 は 代表的なデータ型 の表にはありませんが、true/false を保存する型で、MySQL では 0/1 として扱われます。
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.propertiesのspring.autoconfigure.exclude=...DataSourceAutoConfigurationの行はそのまま残す(DataSourceはまだ使わない)POST /tasksの保存は次章で実装する。この章は一覧の取得元を変えるところまで
データベースで INSERT や DELETE を実行してから /tasks を開き直すと、変更が一覧に反映されることを確かめます。
完成イメージ(tasks テーブルの 3 件):
ヒント
TaskRepository の findAll() は、本文 データアクセスの分離 の BookRepository をなぞります。DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/tasks", "root", "root") で接続し、try-with-resources で Connection・PreparedStatement・ResultSet を扱い、SQLException は catch して RuntimeException で投げ直します。
completed は boolean なので行からは rs.getBoolean("completed") で取り出し、new Task(rs.getString("title"), rs.getBoolean("completed"), rs.getString("notes")) で Task を作ります。
TasksController は new TaskRepository() を持ち、/tasks で taskRepository.findAll() を Model に渡します。表示する tasks.html は T-3 のままで変わりません。