2012-03-04 5 views
0

Javaで準備された文を使用する良い方法がありますが、いくつかのパラメータを設定する可能性があります。JavaのPreparedStatementとパラメータを設定する確率

のは、私がこのような完全なクエリがあると仮定しましょう:

SELECT * FROM Table1 WHERE Field1='....' AND Field2='....' AND Field3='....'

その後、私のプログラムの中で、私はそのような何かをしたいと思います(私はそれが私が書く方法ことはできません知っている)

// part of code where I have 3 variable set by some logic and the query itself 
//......... 

String Query = "SELECT * FROM Table1 WHERE Field1=? "; 
PreparedStatement s = conn.prepareStatement();   
s.setString(1, Field1Var); 

if (Field2Var != Value) 
{ 
    Query += " AND Field2=? "; 
    s.setString(2, Field2Var); 
} 

if (Field3Var != Value3) 
{ 
    Query += " AND Field3=? "; 
    s.setString(3, Field3Var); 
} 
s = conn.prepareStatement(query); 

多くの異なるクエリを書くことなくどのように達成できますか?

+1

ストアドプロシージャを作成し、パラメータ –

答えて

1
String query = "SELECT * FROM Table1 WHERE 1=1"; 

if (Field1Var != Value1) { 
    query += " AND Field1 = ? "; 
} 

if (Field2Var != Value2) { 
    query += " AND Field2 = ? "; 
} 

if (Field3Var != Value3) { 
    query += " AND Field3 = ? "; 
} 

PreparedStatement s = conn.prepareStatement(query); 

int i = 0; 

if (Field1Var != Value1) { 
    s.setString(++i, Field1Var); 
} 

if (Field2Var != Value2) { 
    s.setString(++i, Field2Var); 
} 

if (Field3Var != Value3) { 
    s.setString(++i, Field3Var); 
} 
  1. 追加条件1 = 1を使用します。
  2. カウンタ変数を使用します。

または、私が行ったように "NamedPreparedStatement"を書くことができます。 (https://gist.github.com/1978317)

+0

私はあなたの答えが好きではない。なぜなら、私の問題に答えることができず、2番目だがそれほど重要ではないので、文を準備する前に変数を設定することはできないからである。また、パラメータなしでprepareStatementメソッドを呼び出すことはできません... – Marcx

+0

残念ですが、今はうまくいくはずです。しかし、私はまだあなたの質問をしないと思う。 – alexvetter

+0

実際に私が欲しいことをするために見つけた最良の方法はこれです... – Marcx

0

できません。準備されたステートメントの全体的なポイントは、 "準備されている"ということです。つまり、(ドライバーまたはサーバーによって)解析され、実行ごとにパラメーターを指定することだけです。

あなたが書き込もうとしているコードは、他の誰かが従うべき悪夢となります。ちょうどそれを吸い込んで質問を書いた方がはるかにきれいでしょう。

+0

でプロシージャを実行する可能性がありますが、私のクエリではいくつかのprecalcに基づいていくつかの条件を持つことができます。私は入力をエスケープすることはできますか?私は、この目的のためにpreparedstatementを使用しました... – Marcx

+0

プリペアドステートメント(または、より具体的には、他のJDBCクラスから取得できる「?」を使用したパラメータ置換 - 覚えがたいです)はまさに正しい方法ですSQLインジェクション攻撃を回避します。しかし、(単純にif文をループに変更した他の答えにコメントしたように)あなたがしているのは、準備された文のパラメータを設定し、それを投げ捨てて新しいものを作成することだけです。準備されたステートメントのAPIは(正しい)あなたがしたいことをさせません。 – dty

+0

@dty - これをさらに説明するためのリンクがありますか? – jmort253

0

もう1つの解決策は、動的にクエリを作成することができるHibernate Criteria APIを使用して "よりオブジェクト指向のアプローチ"を使用することですが、私は何の技術を知っていませんスタックを使用します。

関連する問題