データベースのCRUD
前回は、掲示板のデータをデータベースに格納するように(永続化するように)改良した。そこでのポイントは以下の通り。
- Javaでデータベースを扱う(接続する)方法の1つにJDBCがあり、Spring BootにおいてはSpring JDBCという仕組みが使える(他にも色々あるがまずはこれ)。
- H2は組み込みで使えるデータベースで、Spring Bootから簡単に使える。ウェブインターフェースも使える。
- データベースを操作するSQL
- CREATE TABLE: テーブルを作成する
- SELECT: テーブルからデータを取得する
- INSERT: テーブルにデータを投入する。
- 具体的には、JdbcTemplateのメソッドを使って、SQLを実行する。
データベースを使った永続化の扱いの基本はCRUDと言われている。
今回はオンラインメモ帳の開発を通してCRUDを一通り実装してみよう。また、Spring Bootにおけるウェブアプリ開発で使われる基本を紹介する。
ソースコード
- Lect11Controller.java コントローラ
- Note.javaメモを表すクラス
- テンプレート
ポイント
テーブルの作成
前回、テーブルの作成はH2のウェブインターフェースから行ったが、これもプログラムから実行できる。下記はテーブルを作成するプログラムであるが、「IF NOT EXISTS」をつけることによって、テーブルが存在している場合は実行されない(テーブルがない時だけ実行される)。これをコントローラのコンストラクタで実行している。(Lect11Controller.javaの34〜41行目)
レコードの編集(更新)
レコードを更新するにはUPDATEを使う。更新するカラムを「カラム名 = 値」で指定する。WHEREで更新するレコードを限定する。(Lect11Controller.javaの103行目)
フォームのデフォルト値
フォームのデフォルト値はほとんどの場合、value属性で設定することができる。これをTymeleafで設定するには「th:value=”${変数}”』をタグにつければ良い。ただし、textareaタグはタグによって挟まれたところ(textareaの子となるテキストノード)がデフォルト値となるので「th:text」を使う。
非表示でもフォームで送信
画面上に表示させないが、フォームで値を送信したい場合、type属性の値として「hidden」を指定する。(edit.htmlの14行目)
レコードの削除
レコードを削除するにはDELETEを使う。WHEREで更新するレコードを限定する。(Lect11Controller.javaの112行目)
レコードの並び順
SELECTでレコードを取得するときには並び順を指定することができる。「ORDER BY カラム名 順番」を付加する。順番はASC(昇順)かDESC(降順)を指定する。(Lect11Controller.javaの50行目)
改行を含む文字列の表示
HTMLにおいて改行はスペースと同様の扱いになる(基本的には。例外はpreタグ等)。このため改行がある場合は、brタグを挿入する等の処理が必要である。色々な方法が考えられるが、今回のコードでは下記のような処理を行なっている。
- Note.javaにフィールドbodyを改行区切りのListで返すメソッドを追加(Note.javaの20〜30行目)
- テンプレートでは1行づつ取得し、行末にbrタグを付加して表示(view.htmlの19〜22行目)
リンクの動的な生成
index.htmlでは操作に関するリンクを動的に生成している。
- 動的にリンクを生成する(href属性を動的に設定する)にはth:hrefを使う(Using Thymeleaf(リンクURL))。
- @構文を使う
- (name=value)でパラメータを生成できる。
- URLに変数を埋め込むには「__${変数}__」を使う(Using Thymeleaf(プリプロセッシング))。
URLの一部を変数として扱う
マッピングの指定(@GetMapping、@PostMapping、@RequestMapping)で「{}」を使うと、その部分を変数として利用することができる。
Lect11Controller.javaの119行目を見てみよう。ここでは「/view/{id}」となっている。これは、/view/1や/view/2といったURLに対応する。
「{id}」の部分を取得するには、メソッドの引数に、カッコ内と同じ文字列(ここではid)を指定して@PathVariableアノテーションを付加する(Lect11Controller.javaの120行目)。