問題の説明:
クエリ情報を行う際に、条件の数を選択することができますがあります。そのすべての選択は、あなたの要件に基づいてクエリの必要性は必須ではありません。
例えば:
ユーザーは自分のニーズに応じて、あなたはパラメータクエリを選択することができ、我々はいくつかのすべてのケースを持っています
- 引数はありません、すべてのクエリ
- ふるさとメールボックス名+ +
- 生家名+
- 名前メール+
- ふるさとメール+
- フルネーム
- 出生地
- ポスト
あなたが固定されたSQL文を使用している場合は、8つの異なるSQLステートメントを使用します。そして、文字入力を判断するために、一緒にSQL文と裁判官の文章は、非常に長いコード、見苦しい無限の読書を表示します。
ソリューション:
考えます:
- SQLは変化するので、StringBuilderのを使用するのではと思いますされています。StringBuilderのステッチ文字列
- また、様々な異なる入力スプライシングSQLによれば、ユーザの入力を求めます
- 問題にSQLインジェクションを防ぐために、PreparedStatementオブジェクトを使用すると、SQLのSQLの実行を実行します
- 継ぐときスプライシングパラメータは、SQLを与えるために、(名前+起源の場所、後の原産地の最初の名前)の順番を覚えておく必要がありますか?割り当ては、保存されたパラメータのセットにリストを使用します。
コードの実装:
UserDaoクラス{パブリック
/ **
*パラメータに基づいてユーザー情報を照会する
* @param名
* @paramの生家
* @paramメール
* @returnユーザーオブジェクト
* /
静的なパブリックユーザーqueryUser(文字列名、文字列のアドレス、文字列の電子メール){
// 1.処理SQL
ユーザーが入力した// 1.1分析パラメータ、およびスプライシングSQL文
のStringBuilder SQL =新しいStringBuilderの( "選択したユーザからの1 = 1 *"); // 1 = 1 無入力パラメータのためには、検索
<リスト文字列>リスト=新しい新しいのArrayList <>()
IF(= nullを&& name.trim名()のisEmpty()!!){
sql.append( "と名=?");
list.add(名);
}
(アドレス= NULL && address.trim()のisEmpty()!){IF
Sql.append( "アドレスおよび=?");
List.add(アドレス);
}
!IF(メールに電子メールで= NULL &&! {()のisEmpty())TRIM
sql.append(および電子メールに=);?
;)List.add(メールで送信を
}
sql.appendを( ";");
// 2.操作データベース(データベース接続プールドルイドを使用して、)、彼のツールを書いた
;接続コネティカット= nullを
PreparedStatmentてpstmt = NULL;
のResultSet RS = NULL;
ユーザーユーザー= NULL;
試み{
//データ接続オブジェクトを取得2.1
コネティカットJDBCUtil.getConnection =();
//取得2.2 SQLの実行オブジェクト
てpstmt = conn.prepareStatement(sql.toString());
2.3の//設定SQL?値
{(。; I <=はlist.size()I ++ INT I = 1)のため
pstmt.setString(I、List.get(I - 1));
}
// 2.4 SQL文の実行
RS = pstmt.executeQuery()。
ユーザー= resultSetToUser(RS); // resultSetToUser()は、 に結果を書き込むためにセットからユーザオブジェクトを変換する方法である
}キャッチ(省略){
省略
}最後に{
JDBCUtil.close(CONN、てpstmt、RS)。
}
ユーザーを返します。
}
}
ツールのデータベース接続プール(ドルイド):