久しぶりに頭使った~よ
ようやっと、商品販売のDB構築が一段落した。
先週の日曜に一度運用開始をしたのだが、在庫更新処理が上手く行われておらずめちゃくちゃな在庫量を表示していたので、今日はその修正を行った。
具体的な症状としては、商品をDBに登録する際、その商品が初めて登録される(つまり該当する商品NoがDBにない場合)時はSQLでINSERT文を発行し、そうでない時(該当する商品NoがDBにあった場合)はUPDATE文で在庫を更新するという処理を行うのだが、その分岐が上手く動いておらず在庫量の誤差が生まれてしまっていた。 処理の流れとしては、HTMLのフォームから仕入れ情報を入力させ、そのパラメータをJSPにSubmitし、パラメータを受け取ったJSPはそれを変数に格納して、その変数の中の商品Noと在庫DBの商品Noを照合した結果、見つかればUPDATE、なければINSERT文を発行するという処理である。
これを当初はjava.sql.ResultSet型の変数にSELECT 商品No FROM 在庫DB というSQLの問い合わせ結果を格納して、それをパラメータで受け取った方の仕入れ商品Noとwhileで頭から比較するという形で実現しようとしたのだが、コンパイルエラーはでなかったものの、結果として在庫が上手く更新されていなかった。
そこで思いついた解決策としては、ResultSet型の変数にしまわれているDBの中身を、直接比較するのではなく、一度配列なりコレクション型の変数なりに格納し直して、そこから比較をすればよいのではないかということだった。
ただこれを行うと処理を行うごとに配列を生成することになりメモリ不足や処理速度の低下などを招く可能性があり、当初はこの方法を避けていた。
しかし思ったような結果が出ない以上、方法を選んでいる状況でもないので、この方法を使うことに決めた。
そもそも会社の商品データの数なんてたかが知れているし、DBサーバも結構スペック高いものを使っているので大丈夫だろうw
まず取り掛かる上でどのデータ構造を使うか、ということを決めなければならない。
静的配列を使うとなると、データの個数が決まっていなければならないので、DBの中身をしまいこむという今回のケースでは量が常に変化するので適用できない。
となると動的配列(可変長配列)を使うことになるのだが、この可変長配列にはArrayListやらLinkedListやらVectorやらと様々なクラスがあるわけで・・・。正直言ってこの辺りのクラスは今まで使う機会がなかったため使い方もほぼ真っ白な状態です_| ̄|○
以前授業でEnumeration(だったかな?)を使って検索処理のコードを書いたことはあるけれど・・・、はっきりいって実装できるかどうか微妙w
とにもかくにもやってみなけりゃ始まらないってことで、思いつくままにコードを書いてみた。
使ったデータ構造はVectorクラス。以前1回だけ使ったことがあったような・・・という理由で(爆)
色々調べた結果、Vectorを使う時はArrayListを使うように推奨されているそうな・・・。それに気がついたのはコード書き終えてからだったので、メンドいからやめたw
書いたコードはこんな感じ。
/**
- 在庫更新処理
*/
// 変数の初期化、インスタンス生成
Connection con = (自作DBコネクションプールクラス).getConnection();
Statement stmt1 = con.createStatement();
Statement stmt2 = con.createStatement();
Vector vec = new Vector();
String sql = “SELECT [商品No] FROM [在庫テーブル] ORDER BY [商品No]”;
ResultSet rs = stmt1.executeQuery(sql);// DBの商品NoをVectorに格納
while(rs.next()){
vec.addElement(new Integer(rs.getString("[商品No]")));
}// {HTMLフォームのリクエストから取得した商品No}と[Vector要素の商品No]を比較して、あれば在庫更新なければ商品追加
if(vec.contains(new Integer({リクエスト取得した商品No}))){
sql = “UPDATE [在庫テーブル] SET [在庫量] = [在庫量] + " + {リクエスト取得した入荷量} + " WHERE [商品No] = " + {リクエスト取得した商品No};
} else {
sql = “INSERT [在庫テーブル] SET [商品No] = " + {リクエスト取得した商品No} + “, [在庫量] = " + {リクエスト取得した入荷量};
}
stmt2.executeUpdate(sql);
/**
- 在庫更新処理ここまで
*/※[データベースのColumn] {Javaの変数}
赤字=文字列部分 青字=変数部分
一応思惑通りならこれで動くはずだ・・・と早速HTMLフォームにデータを入れて動かしてみる。
すると、しっかり在庫が更新されているではないか!!(´∀`)
いやー俺ってすごいかもw
ってな感じで今日は気分よく仕事をして帰ってきた。やっぱし思ったとおり動いてくれると嬉しいもんだよねぇ。
どーでもよいがJavaでSQLを変数と交えながら書こうとすると非常に見づらくなるんだよなぁ・・・。色分けでもしないとわけわからん。
何かいい方法はないものか。