プログラミング Java

【SpringBootチュートリアル】#8~ 検索機能の実装

投稿日:

概要

・検索フォームから条件を指定して検索すると、条件に一致する結果が一覧画面に表示される。
・検索条件は複合的に指定できることとする。
・検索結果は適切にフォーマットされることとする。
 (日付はyyyy年MM月dd日など)
 

検索条件のリクエスト

リクエストの受信(Controller)

前回(【SpringBootチュートリアル】#7~ 検索画面の作成)作成した画面で、
検索ボタン押下のリクエスト「th:action=”@{/book/search}”」に対応させるメソッドをControllerに定義します。

・@RequestParam Map<String,String>
 リクエストするパラメータが複数ある場合、Mapとして取得することができます。
 Mapでは、<Key, Value>を<画面項目名, 画面項目値>として保持しています。
 (例)書籍名の場合:<name, Javaの基本>

処理の委譲(Service)

サービス層ではビジネスロジックを組み立てます。
検索処理においては特別なロジックはないため、レポジトリ層に直接パラメータを渡した結果を受け取るだけです。

 

DB接続(Repository)

・selectMany(Map<String, String> params);
 selectMany:後述のXMLファイルのidになります。
 引数には検索パラメータが渡されます。

SQL(XMLファイル定義)

・<resultMap type=”com.example.demo.domain.model.Book” id=”book”>
 ここではBook(エンティティ)のフィールド名とテーブルのカラム名をマッピングさせています。
 column:テーブルのカラム名
 property:Book(エンティティ)のフィールド名

・<select id=”selectMany” resultMap=”book”>
 BookRepositoryのメソッド名(selectMany)が対応しています。
 また、resultMapは取得結果のマッピング先の指定であり、
 <resultMap type=”com.example.demo.domain.model.Book” id=”book”>のidに対応しています。

・if test
 指定したフィールドの値を検査し、条件に合致した場合のみif内のステートメントを追加します。

・<bind name=”name_pattern” value=”‘%’ + name + ‘%'” />
 name(書籍名)は部分一致検索を実装するため、nameの前後に%を付与します。
 ただ、%を文字列として直接ステートメントに記述できないため、name_patternに置き替えるためにbind(紐づけて)させています。

・<choose> <when test >
 choose:タグ内の複数条件のうち、最初に合致した条件のみを適用します。
 (例)price_from/price_to
  price_from/price_toの両方が入力されていた場合、
  最初の条件に合致するため、後続のwhenは判定されません。
  もし、price_from/price_toのいずれかが未入力であれば、
  後続のwhenへと処理が進みます。

・<![CDATA[ >= ]]>
 XML内で記述した記号を、ただの文字列として扱うための指定です。
 これが無いと、「=, <, >」をXML文書として認識してしまうので、
 文字列として扱わせるために記号をCDATAセクションで囲っています。
 

検索結果の表示

検索一覧画面に表示する書式は、データによって整形することとしていますので、以下のようにします。

ISBN 3桁-1桁-6桁-2桁-1桁区切り
価格 0を3つ毎にカンマ区切り
出版年月日 yyyy年MM月dd日

※イメージは前回記事(【SpringBootチュートリアル】#7~ 検索画面の作成)参照

これでView側(list.html)に、整形された書籍情報が表示されます。
 

まとめ

・複数パラメータのリクエストは、@RequestParamでMapにマッピングして取得可能。
・Mybatisのif, choose-whenステートメントによって検索条件を動的に指定できる。
・検索結果一覧への表示用にメソッドを用意すると、画面では表示メソッドをコールするだけで済む。

最後までお読み頂きありがとうございました!
もし内容が良かったらシェアをお願い致します!

-プログラミング, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

【Java転職者向け】どんなポートフォリオを作成すべきか?

Javaプログラマとして開発リーダと新人教育をした立場から執筆しています。 対象読者 未経験からJavaプログラマに就職・転職しようとする方 目次 なぜポートフォリオを作成するのか? ・スキルアップ …

【Laravel】SQLの確認はenableQueryLogを使う

SQLのデバッグのために、SQLとバインドされた値を確認したいことがあります。 その時に使える方法として、よく提示されるのは以下の2つです。 1.enableQueryLogメソッドとgetQuery …

SpringでNotNullなどのバリデーションが効かないときの対処法

状況 フィールドに入っている値は空文字なのに、 @NotNull, @NotEmpty, @NotBlankでエラーとして検知されない。 (BindingResultでhasErroe=0件となる) …

【SpringBootチュートリアル】#7~ 検索画面の作成

概要 書籍情報を検索するフォーム(検索フォーム)と検索結果を表示する画面(検索結果一覧)を作成します。 検索フォームと検索結果一覧はHTMLファイルを分けて作成しています。 分けることは必須ではなく、 …

【Javaサンプル】自動販売機(Level4) ドメイン駆動

前回(Level3) Level3ではクラス分けすることを行いました。 しかし、私の目指すところのドメイン駆動開発になっていません。 また、ロジックもまだまだ複雑さが残っており、ぱっと見て何をやってい …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。