1. Spring JDBC による書籍テーブル更新
1-1. 実習テーマ
- 書籍登録フォーム画面をエセでなくちゃんと作成する
- Spring JDBC を使用して書籍情報登録処理を実装する
- 書籍情報登録結果を画面に表示する
1-2.今回やること および 学習ポイント
- 書籍登録フォーム画面をエセでなくちゃんと作成する
- やること
- 書籍登録フォームコントロールクラスの実装
- 書籍登録フォームJSPの実装
- 学習ポイント
- Spring カスタムタグを学習する
- フォーム入力値をコントローラで取得する方法を習得する
- やること
- Spring JDBC を使用して書籍情報登録処理を実装する
- やること
- 書籍登録Daoクラスの実装
- 書籍登録サービスクラスの実装
- 書籍登録コントロールクラスの実装
- 学習ポイント
- データベース登録・更新処理の実装方法を把握する
- データ登録SQLテンプレートの設定方法
- やること
- 書籍情報登録結果を画面に表示する
- やること
- 登録処理を表示する画面コントロールクラスを実装する
- 同様のJSPを作成する
- 学習ポイント
- 書籍登録処理結果の表示(とりあえず正常系のみ。異常系はこの後)
- やること
2. 技術解説 - フォームから入力データを取得する - Spring MVC
2-1. Spring MVC によるデータ登録の流れ
- フォーム画面より入力したデータは、Spring MVC の Model オブジェクトにマッピングされる
- 入力データをマッピングした Model オブジェクトは、Controller メソッドの引数として渡される
2-2. Spring Form Tag を使用した入力フォーム
-
Spring MVC でフォーム画面を実装するには、Spring MVC に用意されている Spring Form Tag が便利
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <!-- @@@ @@@ 上のtaglibディレクティブで Spring Form taglibrary を取り込む @@@ --> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head><title>書籍登録画面</title></head> <body> <h1>書籍登録画面</h1> <form:form action="addbook" method="POST" modelAttribute="book"> <!-- @@@ @@@ modelAttribute で Model とドメインオブジェクトがマッピングされる @@@ 上記の場合、"book" という名前の Book オブジェクトとして取得される @@@ --> <table><tr> <th>ISBNコード</th> <td><form:input path="isbn"/></td> </tr><tr> <th>書籍名</th> <td><form:input path="name"/></td> </tr><tr> <th>価格</th> <td><form:input path="price"/></td> </tr></table> <!-- @@@ @@@ 取り出したBookオブジェクトの各プロパティには @@@ isbn や name などのプロパティ名だけでアクセスできる @@@ --> <input type="submit" value="登録" /> </form:form> </body> </html>
-
上記フォームは、input タグの例であるが、この他にも、SELECT や CHECKBOX など比較的複雑なタグもSpring Form Tab で記述できる
2-3. フォームで入力されたデータを Controller で受け取る
- フォームで入力されたデータは、HTTP POST でサーバに送信されるが、そのデータは Spring MVC で Model の modelAttribute に追加される。
- modelAttribute に追加された Domain は、Controller メソッドの引数として受け取ることが可能
-
modelAttribute の登録名はドメインクラス名から自動的に決定されるが、Controller に引数に @ModelAttribute アノテーションを付与すると任意の登録名でもデータを取得することができる
@RequestMapping(value = "/addbook", method = RequestMethod.POST) public String addBook(@ModelAttribute("book") Book book) throws Exception { // @@@@ ↑ // @@@@ フォーム入力値(リクエストパラメータ)は自動的に // @@@@ ドメインオブジェクトに格納され、コントローラの引数 // @@@@ として受け取ることができる // @@@@ // Something to do // ... }
2-4. Controller メソッドの引数について
- Controller メソッドの引数として渡される情報は @ModelAttribute なオブジェクトに限らない
-
以下の情報がメソッド引数として渡されてくるためアプリで受け取ることができる
- URIテンプレートを使用した時の @PathVariable を付けた変数
- HTTPリクエストパラメータ @RequestParam を付けた変数
- アップロードファイル
- HTTPリクエストヘッダ @RequestHeader を付けた変数
- クッキー @Cookie を付けた変数
- HTTPリクエストのメッセージボディ @RequestBody を付けた変数
- HTTPEntityオブジェクト
- Model オブジェクト
- ModelAttributeオブジェクト @ModelAttribute を付けた変数
- Session管理オブジェクト
- エラーオブジェクト
- WebRequestオブジェクト
- Servlet API の各種オブジェクト
- ロケール
- その他
3. 技術解説 - Spring JDBC を使用したデータ更新処理
3-1. Spring JDBC によるデータベース更新の流れ
- Spring JDBC を使用したデータベース更新処理でも、JdbcTemplate オブジェクトを使用する
-
今回は、JdbcTemplate をさらに使いやすくした NamedParameterJdbcTemplate クラスを使用してみる
3-2. Spring JDBC を使用したDB更新プログランミング
3-2-1. プレースホルダでパラメータを指定するサンプル
-
INSERT 文
jdbcTemplate.update("INSERT INTO book (id, isbn, name) VALUES (?, ?, ?)", book.getId(), book.getIsdn(), book.getName());
-
UPDATE 文
jdbcTemplate.update("UPDATE book isbn = ?, name = ? WHERE id = ?", book.getIsdn(), book.getName(), book.getId());
-
DELETE 文
jdbcTemplate.update("DELETE FROM book WHERE id = ?", book.getId());
3-2-2. NamedParameterJdbcTemplate を使用してパラメータを指定するサンプル
-
INSERT 文
MapSqlParameterSource pmap = new MapSqlParameterSource(); pmap.addValue("ID", book.getId()); pmap.addValue("ISBN", book.getIsbn()); pmap.addValue("NAME", book.getName()); namedJdbcTemplate.update( "INSERT INTO book (id, isbn, name) VALUES (:ID, :ISBN, :NAME)", pmap);
-
UPDATE 文
MapSqlParameterSource pmap = new MapSqlParameterSource(); pmap.addValue("ID", book.getId()); pmap.addValue("ISBN", book.getIsbn()); pmap.addValue("NAME", book.getName()); namedJdbcTemplate.update( "UPDATE book isbn = :ISBN, name = :NAME WHERE id = :ID", pmap);
-
DELETE 文
MapSqlParameterSource pmap = new MapSqlParameterSource(); pmap.addValue("ID", book.getId()); namedJdbcTemplate.update("DELETE FROM book WHERE id = :ID", pmap);
4. ハンズオン実習
STEP05 ハンズオン
-
ハンズオン資料「 STEP05 - Spring JDBC による書籍テーブル更新 」に従い実習を開始してください。
- Spring MVC によるデータ登録方法を学習しましょう
- Spring Form Tag の考え方、使い方を把握しましょう
- フォームに入力した値を Controller で受け取る方法を習得しましょう
- Controller メソッドの引数として取得できる情報を学習しましょう
- Spring JDBC を使用したデータベース更新方法を覚えましょう
- NamedParameterJdbcTemplate の使い方を覚えましょう
- Spring MVC によるデータ登録方法を学習しましょう
STEP05 実装イメージ - 処理シーケンス
STEP05 実装イメージ - Spring JDBC によるデータ登録・更新処理
次のステップ
次のステップは「 STEP06 - 日本語文字化け対策と Validation の実装 」です。だいぶ進んできました!