検索機能を実装する(これまでのまとめ)
今回作ること
- 商品一覧ページにキーワード検索フォームを追加する
ProductMapperにLIKE検索メソッドを追加するProductControllerでキーワードを受け取り検索結果を渡す
この章は最終章である。 新しい概念はほとんど登場せず、これまでに学んだ Model → Controller → Mapper → DB の流れを総復習する形で進める。
1. 商品一覧に検索フォームを追加する
ポイント
method="get"により、キーワードは URLのクエリパラメータ(?keyword=コーヒー)として送信される。th:value="${keyword}"で、検索後に入力欄に検索ワードが残るようにする。
2. ProductMapper にキーワード検索メソッドを追加する
3. ProductMapper.xml にLIKE検索SQLを追加する
ポイント
LIKE '%キーワード%'で部分一致検索ができる。- MyBatis で
LIKEを使う場合、#{...}の中で文字列連結して%を付ける。${}を使うとSQLインジェクションの危険があるため、必ず#{}を使うこと。
4. ProductController を更新する
ポイント
required = falseを付けると、keywordパラメータがない場合(通常の一覧表示)にnullが渡される。
5. 動作確認
- アプリを再起動する。
http://localhost:8080/productsにアクセスする。- 検索フォームに「カップ」と入力して「検索」をクリックする。
- 「コーヒーカップ」「マグカップ」が表示されることを確認する。
- 入力欄に「カップ」が残ることを確認する。
- 空欄で検索すると全商品が表示されることを確認する。
Gitコミット
git add .
git commit -m "feat: 商品名キーワード検索機能を追加"
ハンズオン完了! これまでの振り返り
おめでとうございます。Spring EC ショップが完成した。
ここで、これまでに実装してきた機能を振り返ろう。
実装した機能
| 章 | 機能 | 使用した技術 |
|---|---|---|
| 02 | トップページ・商品一覧表示 | @Controller, Thymeleaf |
| 03 | 商品詳細ページ | @PathVariable |
| 04 | Modelでデータ渡し・Productクラス | Model, th:each |
| 05 | 共通レイアウト | Thymeleaf フラグメント |
| 06 | ユーザ登録フォーム | @ModelAttribute, UserForm |
| 07 | 入力値バリデーション | @Validated, BindingResult |
| 08 | Service層の導入 | @Service, コンストラクタインジェクション |
| 09 | 商品データのDB連携 | MyBatis, @Mapper, XML Mapper |
| 10 | カート機能 | HttpSession |
| 11 | ログイン・ログアウト | HttpSession, UserMapper |
| 12 | 購入処理・注文保存 | @Transactional, バルクインサート |
| 13 | キーワード検索 | @RequestParam, LIKE検索 |
MVC アーキテクチャの全体像
ブラウザ
↕ HTTP リクエスト/レスポンス
Controller(@Controller)
↕ Model にデータを追加
↕ Service に処理を委譲
Service(@Service)
↕ Mapper を呼び出す
Mapper(@Mapper)
↕ SQL を実行
DB(PostgreSQL)
↕ 結果を返す
Mapper → Service → Controller → Model → View(Thymeleaf HTML)
↓
ブラウザに HTML を返す
次のステップ
このアプリをさらに発展させるアイデアを紹介する。 取り組めるものから挑戦してみよう。
- パスワードのハッシュ化:BCrypt を使ってパスワードを安全に保存する
- 商品の管理画面:管理者が商品を追加・編集・削除できるようにする
- 注文履歴ページ:ログインユーザの過去の注文を表示する
- 在庫管理:購入時に在庫数を減らす仕組みを追加する
- デザインの改善:Bootstrap などのCSSフレームワークを導入する
- ページネーション:商品一覧を複数ページに分割する
おつかれさまでした。Spring の基本構造を一通り体験できた。 ここで身につけた「MVC の流れ」「DBとの連携」「セッション管理」の考え方は、 どのフレームワークを使っても共通して活きるものである。