2012-02-28 4 views
1

私が取り組んでいるプロジェクトでは、ExtJSフレームワークを大量に使用しています。表示するデータはたくさんあり、グリッドを使用してデータを送信します。グリッドは、すべて標準のページング、ソート、およびフィルタリング機能を備えています。リモートグリッドフィルタリング/ページ区切り/並べ替えのためのMyBatisを使用した非常に動的なクエリ

現在、私たちのバックエンドはPHPで作成されており、まっすぐなSQLを使用しています。 PHPでは、クエリ、フィルタのリスト、ソート情報、ページ情報を受け入れ、適切なWHERE、ORDER BY、およびページ分割機能を持つクエリを出力するSQLラッパーを、サブクエリとして元のクエリを使用して作成しました。私たちのプロジェクトはOracleに関連していることに注意してください。

フィルタは、比較の形式(=、<、< =、> =、>、IS NULL)またはリスト(IN())になり、並べ替えは単方向の列です。ページネーションは開始と終了の列です。

SpringishとMyBatisを使用してJavaベースのアーキテクチャに移行しようとしています。私は簡単な方法でMyBatisを使用して同じ機能をどのように実装するかを考え出すのに苦労しています。ラッパーについての良い点は、ベースクエリを一度書いておけば、グリッドに必要なクエリーに変身するということでした。潜在的に何万ものレコードについて話しているので、ページングが必要になり、サーバーに物事を戻して、Javaベースのフィルタリング/並べ替えを行うことは実際の選択ではありません。

これまで誰かがこの(または同様の)問題を解決しましたか?私はMyBatisのDynamic SQL機能を簡単に見てきましたが、必要な柔軟性とパワーを提供していないようです。私が間違っている?

味付けされたMyBatisユーザーからのガイダンスは非常に高く評価されます。

私たちは今調査中であり、ORMを使用しても完全にテーブルから離れているわけではないことに注意してください。これは、例えば、Hibernateを使って簡単に達成できますか?

+0

私は、無限スクロールページングとリモートフィルタ/ソートで同じことをしているプロジェクトに入っています。グリッドは10k〜30kのレコードを持っています。私はそれをすべてサーバーに戻し、問題なくJavaのフィルタリングと並べ替えを使用します。フィルタやソートをバックエンドに渡すと、Ajaxの応答は100〜200msの範囲になります。私はTomcatとsqlserverでORMを実行していますが、ApacheのDBUtilsとapacheコレクションのライブラリだけです。あなたがそのルートを試してみたいと思ったら、私はおそらくそれをどのようにセットアップしているのでしょうか。 – Geronimo

+0

うわー。メモリフットプリントはどうですか?あなたは通常どのくらい多くの要求を処理する必要がありますか?それを見ると、これは最適な解決策ではないと感じましたが、100〜200msの応答で暮らすことができました。あなたがしていることについてもっと聞いてみたい! –

+0

私がしていないことの1つは、各リクエストでデータベースから新しいデータを取り出すことです。頻繁に変更されないため、定義された時間だけサーバー上で調理しています。それぞれのリクエストで新しいクエリを実行しなければならない場合、私は別の何かをしなければならないと確信しています。そのため、requests/secは決してデータベースの終わりには配慮されませんでした。サーバー側では、これは一度にすべてではない50〜100人のユーザーのイントラネットアプリケーションです。そこにも重い。 – Geronimo

答えて

2

私は、Springの代わりにGuiceを使用していますが、私のクエリは階層的です(結果はツリーテーブルに表示されます)。これは非常に複雑です。

私はMyBatisがこれをうまくやることができると思います。 しかし、クエリの動的部分については、私はMyBatisをPHPと同じように実装しています:JavaでステートメントのWHEREとORDER BY部分を生成してください。

、マッピングファイルで直接文字列置換を使用し、お使いのベースのクエリおよび再利用可能なスニペットのベースクエリ自体のMyBatisの結果マップを定義します。このような

何か:については

<resultMap id="TaskMap" type="de.foobar.dtos.TaskDto"> 
    <id column="id" property="id"/> 
    <result column="description" property="description"/> 
    ... 
</resultMap> 

<sql id="baseQuery"> 
    select id, description from tasks 
</sql> 

<select id="selectSingle" resultMap="Task2Map"> 
    select bq.* 
    from (
      <include refid="baseQuery"/> 
     ) bq 
    where bq.id = #{id} 
</select> 

<select id="selectAll" resultMap="Task2Map"> 
    select bq.* 
    from (
      <include refid="baseQuery"/> 
     ) bq 
    where ${filterClause} 
    order by ${orderByClause} 
</select> 

をあなたは別のサブクエリを奇妙なoracle rownum構造体を使用するためにラップする必要があります(しかし、あなたはおそらくすでにそうしています)。

もちろん、通常の警告が当てはまります:MyBatisの$ {}構文は、(プリペアドステートメントのパラメータではなく)文字列の代入を行っているため、SQLインジェクションを避けるためにユーザ入力を慎重に注意してください。

関連する問題