2017-01-28 36 views
0

文字列のをSearchResultsActivityからSearchResultPresenterに渡す方法を教えてください。おかげWhere句の中に文字列変数を挿入します

My活動

public class SearchResultsActivity ...{ 
... 

mPresenter.getUsers(searchQuery); 

... 

} 

マイプレゼンター

public class SearchResultPresenter ...{ 

... 
public void getUsers(String searchQuery) { 

String query = "....Contains(name, 'searchQuery') "; // this doesn't work, shows the method parameter `searchQuery` is never used. 

String whereClause = String.format(query, ...); 

} 

}

+0

'PreparedStatement'と* bind parameters *を使う方が良いです。 'String.format'を使うことは似ています('? 'ではなく'%s'で)。 "String query" = .... "(name、 '%s')"; 'そして' String.format(query、searchQuery); ' –

答えて

0

通常あなたはこのためにPreparedStatementを使用し、文字列内のパラメータは、単に疑問符になります。このようなもの:

Connection con = DriverManager.getConnection(url, "UN", "PW"); 
    PreparedStatement ps = con.prepareCall("select * from table where contains(textcol,?)"); 
    ps.setString(1,"the string that will replace the question mark"); 
///in your case 
ps.setString(1,searchQuery); 
    ResultSet rs = ps.executeQuery(); 

パラメータがintの場合、代わりにps.setInt(...)を実行します。 文字列に値を連結するだけでも可能ですが、すべての種類の問題が発生する可能性がありますので、その習慣を邪魔しないでください。

具体的には、検索文字列変数をps.setString()メソッドに直接入れることができ、クエリー文字列に疑問符を含む静的な最終クラスレベル文字列を使用できます。

+0

ありがとう@markg、それを試して元に戻す。私の直面するジレンマは、私がバックエンドをサービスとして使用しているように、アクティブな接続 "con"を定義する方法です。バックエンドはまったくありません。 – Geob

+0

よく知られているように、私が掲示したコードはエンドポイント内で実行されます(TomcatやWebサーバーのjettyなど)。サービスコールは検索文字列paramを取るだけです...あなたが話していることを本当に理解していると仮定すると;-) – markg

0

String.format()を使用してこれを行うことができます。

String query = String.format("....Contains(name, '%s')", searchQuery); 
+0

あなたは文字列query = String.format( "....(%、 '%s')、searchQuery)を含みます; – Geob

+0

編集のためのJesseさん、ありがとうございます。このSQLインジェクションは安全ですか? – Geob

+0

フルテキスト検索で例外がスローされる文字列が文字列に含まれないことが確実でない限り、これはお勧めできません。 searchQueryに 'が入っていると、それは壊れてしまいます。そして、このステートメントがどこで実行されるかによって、理論的にはSQLインジェクションの問題を引き起こす可能性があります – markg

関連する問題