SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

OSSフレームワーク「dataforms.jar」でサンプルプログラムを構築する(2)

  • このエントリーをはてなブックマークに追加

 本記事ではMVCそれぞれの機能を1つのjarファイルにまとめた、中小規模Webアプリ開発向けのOSSフレームワーク「dataforms.jar」を使い、掲示板のサンプルアプリケーションを構築します。前回は、テーブルとフィールドクラスの作成、ページとフォームクラスの作成、ページクラスからのHTML作成を行いました。今回は検索条件の調整、添付ファイルテーブルの操作機能を追加します。

  • このエントリーをはてなブックマークに追加

はじめに

 前回の記事では、テーブルとフィールドクラスの作成、ページとフォームクラスの作成、ページクラスからのHTML作成といった流れで作業を行いました。前回の記事で作成したコードの大半は、dataforms.jarの開発ツールで生成したものです。開発ツールで作成したページは、記事テーブル(article)のみを操作するコードを生成します。この段階で、検索条件を指定して該当する記事のリストを表示し、そのリストから選択したレコードを編集するようなアプリケーションがそれなりに動作していますが、まだ実用的なレベルには達していません。そこで今回は検索処理を改善し、さらに添付ファイルテーブル(attach_file)の操作を追加していきます。

対象読者

 この記事を読むために必要な知識は以下の通りです。

  • Java
  • JavaScript
  • jQuery、jQuery UI
  • HTML、CSS
  • SQL

必要な環境

 dataforms.jarを使用した開発では、以下のものを使用しています。

  • JDK1.8
  • Eclipse 4.5以上
  • Tomcat 7以上

検索条件の調整

 前回の記事ではArticleQueryFormには何も入力せず[検索]ボタンを押下し、全ての登録データを表示させました。今回は検索条件を入力して[検索]ボタンを押下してみます。

条件を指定した検索
条件を指定した検索

 このような検索条件を指定した場合、ログを確認すると以下のSQLが発行されていることが確認できます。

生成されたArticleTable.java
2017-03-15 23:03:18,874 DEBUG SqlParser - parsedSql = select * from (select row_number() over() as row_no, m.* from (select
m.article_id as article_id
,m.thread_id as thread_id
,m.title as title
,m.auther as auther
,m.contents as contents
,m.delete_flag as delete_flag
,m.create_user_id as create_user_id
,m.create_timestamp as create_timestamp
,m.update_user_id as update_user_id
,m.update_timestamp as update_timestamp
 from article as  m
 where m.title = ? and m.auther = ? and m.delete_flag='0'  order by m.article_id asc) as m) as m where (? + 1) <= m.row_no and m.row_no <= (? + 1)
2017-03-15 23:03:18,874 DEBUG SqlParser - 1 :title=タイトル1
2017-03-15 23:03:18,874 DEBUG SqlParser - 2 :auther=著者1
2017-03-15 23:03:18,874 DEBUG SqlParser - 3 :row_from=0
2017-03-15 23:03:18,874 DEBUG SqlParser - 4 :row_to=9

 このSQLを見ると分かると思いますが、ArticleQueryFormに入力したタイトルと、著者で限定するwhere句が出力されていることが分かります。テーブルを検索するメソッドを以下に示します。

ArticleDao.javaの検索メソッド
/**
 * QueryFormから入力された条件から、テーブルを検索し、指定されたページの情報を返します。
 * @param data 条件データ。
 * @param flist 条件フィールドリスト。
 * @return 検索結果。
 * @throws Exception 例外。
 */
public Map<String, Object> queryPage(final Map<String, Object> data, final FieldList flist) throws Exception {
    Query query = new ArticleTableQuery();
    query.setQueryFormFieldList(flist);
    query.setQueryFormData(data);
    String sortOrder = (String) data.get("sortOrder");
    FieldList sflist = query.getFieldList().getOrderByFieldList(sortOrder);
    if (sflist.size() == 0) {
        query.setOrderByFieldList(query.getMainTable().getPkFieldList());
    } else {
        query.setOrderByFieldList(sflist);
    }
    return this.executePageQuery(query);
}

 このメソッドではArticleTableQueryに対し、ArticleQueryForm中に配置されたフィールドのリストと、ArticleQueryFormで入力された検索条件を渡しています。この情報から、Queryクラスが自動的にwhere句を生成します。今回はタイトルと著者のみ入力され、本文が入力されていません。そのため生成される条件はタイトルと著者のみを限定するものとなっています。

 実行されたSQLをよく見ると、タイトルや著者の条件式が完全一致になっています。これだと使い勝手が悪いので部分一致に変更します。「ArticleQueryForm.java」の以下の太字部分を修正します。

「ArticleQueryForm.java」のフィールド設定を変更
/**
 * コンストラクタ。
 */
public ArticleQueryForm() {
    ArticleTable table = new ArticleTable();
    this.addField(table.getTitleField()).setMatchType(MatchType.PART);
    this.addField(table.getAutherField()).setMatchType(MatchType.PART);
    this.addField(table.getContentsField()).setMatchType(MatchType.PART);

}

 この修正で、部分一致のSQLが生成されるようになります。

部分一致のSQL
2017-03-16 18:13:03,602 DEBUG SqlParser - parsedSql = select * from (select row_number() over() as row_no, m.* from (select
m.article_id as article_id
,m.thread_id as thread_id
,m.title as title
,m.auther as auther
,m.contents as contents
,m.delete_flag as delete_flag
,m.create_user_id as create_user_id
,m.create_timestamp as create_timestamp
,m.update_user_id as update_user_id
,m.update_timestamp as update_timestamp
 from article as  m
 where m.title like ? {escape '\'}  and m.auther like ? {escape '\'}  and m.delete_flag='0'  order by m.article_id asc) as m) as m where (? + 1) <= m.row_no and m.row_no <= (? + 1)
2017-03-16 18:13:03,603 DEBUG SqlParser - 1 :title=%タイトル%
2017-03-16 18:13:03,603 DEBUG SqlParser - 2 :auther=%著者%
2017-03-16 18:13:03,603 DEBUG SqlParser - 3 :row_from=0
2017-03-16 18:13:03,603 DEBUG SqlParser - 4 :row_to=9

 フィールドに指定するMatchTypeは以下の表の通りです。条件式中の":field_id"は最終的に"?"に置換されて、パラメータマップ中の"fieldId"の値が設定されます。

MatchTypeの種類
MatchType 生成される条件式
MatchType.FULL 完全一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。
field_id = :field_id
MatchType.PART 部分一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。
field_id like :field_id
パラメータとして渡す値の前後に"%"を付加します。
MatchType.BEGIN 先頭一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。
field_id like :field_id
パラメータとして渡す値の後に"%"を付加します。
MatchType.END 末尾一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。
field_id like :field_id
パラメータとして渡す値の前に"%"を付加します。
MatchType.RANGE_FROM 範囲開始の条件式を作成します。フィールドIDが"fieldIdFrom"の場合以下の条件式を生成します。
field_id >= :field_id_from
MatchType.RANGE_TO 範囲終了の条件式を作成します。フィールドIDが"fieldIdTo"の場合以下の条件式を生成します。
field_id <= :field_id_to
MatchType.IN INの条件式を生成します。MultiSelectFieldのフィールドに対して指定します。フィールドIDが"fieldId"の場合以下の条件式を生成します。
field_id IN (:field_id[0],:field_id[1], ... ,:field_id[n])

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
<select>タグの選択肢の設定

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

高柳 正彦(タカヤナギ マサヒコ)

経験年数30年を超えた、システムエンジニアです。一応管理職のはずですが、未だにコードを書いています。この仕事を長々とやっていると、それなりにノウハウがたまってきます。そのノウハウをまとめたものができないかと思い、独自のフレームワークを作り始めました。そのフレームワークもそれなりに使えるようになってき...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10043 2017/05/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング