前提・実現したいこと
jspのフォーム画面の検索項目3つ(氏名、誕生月、職種)に入力された値をサーブレットで取得し、SQL文のwhere句以降に連結してmysqlデータベースのテーブル(usertable)から検索結果を取得したいです。
条件:
① JDBCのPreparedStatementを利用する
② AND検索をする
③ 検索項目が空欄の場合は、その項目は絞り込み対象外とする。
④ 全て空欄の場合、全レコードを取得する
上記条件③のせいで、
「SQL文の生成方法」
「SQL文の"?"に割り当てるパラメータインデックス値の決め方」
について分からなくて悩んでいます。
該当のソースコードの一部
JAVA
1 Connection con = null; 2 PreparedStatement st = null; 3 try{ 4 con = 省略; 5 6 String sql = "SELECT * FROM usertable"; 7 boolean flag = false; 8 //名前が入力されていればwhere句で連結、されなければスキップ 9 if (!user.getName().equals("")) { 10 sql += " WHERE name like ?"; 11 flag = true; 12 } 13 //誕生月が入力されていれば処理を実施 14 if (user.getBirthday()!=null) { 15 //名前が入力されていなかった場合はWHERE、されていたらAND 16 if(!flag){ 17 sql += " WHERE birthday like ?"; //名前が空欄の時はこの?が1番目 18 flag = true; 19 }else{ 20 sql += " AND birthday like ?"; //名前が入力されればこの?は2番目 21 } 22 } 23 //職業が入力されていれば処理を実施 24 if (user.getType()!=0) { 25 //名前も誕生月も空欄だった場合はwhere、どちらかもしくは両方入力されていたらAND 26 if(!flag){ 27 sql += " WHERE type like ?"; 28 }else{ 29 sql += " AND type like ?"; 30 } 31 } 32 st = con.prepareStatement(sql); 33 st.setString(★1, "%"+user.getName()+"%"); 34 st.setString(★2, "%"+ new SimpleDateFormat("yyyy").format(user.getBirthday())+"%"); 35 st.setInt(★3, user.getType());
分からないこと
① 入力項目の有無によってSQL文を連結していく方法はこれで良いのでしょうか? ifがネストになっている点がとても拙く感じるのですが・・・。
② ★で示す、?に対応するパラメータインデックス値はどのように決めればよいでしょうか。
具体的に悩む点は、名前だけ空欄の場合、名前も誕生月も空欄の場合、誕生月だけ空欄の場合などどこが空欄のまま検索されるかで?の個数も変わるので、例えば名前だけ空欄にするとインデックス範囲は2までだと怒られます。
java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
?の個数が選択次第で変わる状態でどうパラメータインデックス値を当て込めばいいかがわかりません。
宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー