JDBC は動的クエリをどのように実装しますか?

零下一度
リリース: 2017-07-21 14:12:56
オリジナル
1083 人が閲覧しました

ネットワーク開発では、複数の条件を含む包括的なクエリが非常に一般的であり、このビジネス ニーズに対処するには、通常、次の方法を使用します:
1. パラメーター値を SQL ステートメントに直接結合します。そしてクエリを実行します。
このメソッドのセキュリティは比較的貧弱であると言え、SQL によって誤って挿入される可能性があります。最初にパラメータ値の特殊文字をフィルタリングすることもできますが、それは常に非常にエレガントであるとは限りません。
2. 最初にプレースホルダーを使用しますか? ' を使用して SQL を結合し、条件判断によって PreparedStatement を埋めます。
この方法で TX を使用したことがある人なら、この方法の複雑さを知っています。まず、SQLを書くときに一度判断しなければならず、PSTを記入するときに再度判断しなければならないので面倒です。
3. プロシージャ ストレージ
私は以前、プロジェクトを MySQL から MSSQL に移行し、最終的には異なるバージョンの製品を別のデータベースで実行することにしました。時間。 。
実際、私が言いたいのは、比較的エレガントでシンプルなクエリ メソッドが欲しいということだけです。前の段落で .NET で提供されている SQLHelper に触発されて、同様のコンポーネントを作成しました (実際、Google で調べました)。要件を満たす根拠が見つかりませんでした

1. 動的クエリとは何ですか?

クエリの DQL ステートメントを作成するこのプロセスは、動的クエリと呼ばれます。 2. 動的クエリの難しさ

選択できるクエリ条件が多く、組み合わせも多いため、すべてをリストするのは難しい

3. 最終的なクエリ文の構成

ユーザーがクエリ条件データを入力すると、クエリ条件は最終条件の一部になります

2 つの基本原則

クエリ条件に関係なく、クエリ フィールドとデータベースは修正されていますが、変更された内容は、
select column... from table。
ログイン後にコピー

などの SQL ステートメントの基本フレームワークを形成します。パラメータが空ではない場合、「name=?」、「age>?」などのリクエスト パラメータに基づいてクエリ条件が生成され、そのクエリ条件を

基本フレームワークに追加します。ここで、生成されたクエリ条件に「and」を追加する必要があるかどうかをどのように判断するかという疑問が生じます。

このクエリ条件が最初のクエリ条件である場合、「and」を追加する必要はありません。それ以外の場合、問題が発生します。クエリ

条件を生成するたびに、前のクエリ条件

が存在するかどうかを判断する必要があります。このクエリ条件の存在はクエリに影響を与えません。これらの要件に従って、この A クエリ条件は常に true である必要があり、基本は「1=1」となります。 SQL フレームワークは

select column...from table where 1=1
ログイン後にコピー
各動的クエリ条件の前に「and」を追加します
3. .List コレクションは値をプレースホルダーに割り当てます
DQL ステートメントでは、次のことを行う必要があります。プレースホルダーに値を割り当てる方法を検討してください。クエリ条件を生成するときに、プレースホルダーに対応するパラメーターを収集して 1 つに保存することができます。これにより、プレースホルダーが連続するようになります。 List コレクション内の要素との対応関係。n 番目のプレースホルダーは、プレースホルダーに値を割り当てるだけでなく、そのプレースホルダーにも対応します。また、フィールドと一致するデータ型を選択する必要もあります。リスト コレクションは、データを保存するだけでは要件を満たすことができなくなり、さまざまなフィールドを区別し、コレクション内の要素を選択する必要があります。 「列+データ」の形式になります。 3 つのデモ
1. データベース

2.

3.服务器端(Servlet)

"/dynamicQueryServlet"  DynamicQueryServlet     serialVersionUID = 1L "text/html;charset=UTF-8"String name = request.getParameter("name"= request.getParameter("sex"= request.getParameter("age"= request.getParameter("depNo"String baseSQL = "select name,sex,age,depNo from tb_employee where 1=1"=  StringBuilder();List<String> params =  ArrayList<String>" and name=? ""name," + name);" and sex=? ""sex," +" and age=? ""age," +" and depNo=?""depNo," += = = = == ( i = 0; i < params.size(); i++== str.split(","); (arr[0].equals("age" a = Integer.parseInt(arr[1+ 1+ 1, arr[1== res.getString("name"= res.getString("sex" targetAge = res.getInt("age"= res.getString("depNo"= "name=" + targetName + "--" + "sex=" + targetSex + "--" + "age=" + targetAge + "--"
                        + "depNo=" ++ "<br>" (ClassNotFoundException | (res !=  (ps !=  (conn != = length = (length == 0"查询为空"+ "<br>" +   (str ==  | str.equals(""    Connection getConnection() "com.mysql.jdbc.Driver" DriverManager.getConnection("jdbc:mysql://localhost:3366/test01", "root", "123"
ログイン後にコピー

以上がJDBC は動的クエリをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!