- PR -

preparedStatement とNull可の数値カラム

1
投稿者投稿内容
Tom
常連さん
会議室デビュー日: 2004/06/07
投稿数: 23
お住まい・勤務地: 東京都
投稿日時: 2004-06-09 17:54
こんにちは。
今、preparedStatementを使ってNull可の数値カラムにNULLを入れようとして苦戦しています。
例えばsetIntメソッドだとNullは無理ですのでsetNullしかないと思うのですが
それだと数値入力のところですべて条件判断をしなくなければならないので
コードの保守的にあまりいい仕様とは思えません。
例えば

Integer num1;
Integer num2;
Integer num3;
Integer num4;

pstmt = conn.preparedStatement("UPDATE TABLE1 SET NUM1=?, NUM2=?, NUM3=?, NUM4=?");
if (num1==null) {
pstmt.setNull(1, DECIMAL);
}
else {
pstmt.setObject(num1);
}
・・・以下略

でもバインド変数を使わなければSET NUM1=NULLみたいになってうまくいくわけですよねぇ。
最近の書物ではパフォーマンスがよくなるし、SQLへの文字列の変換処理もなくなるので
Bind変数を使えとよく書いてありますが、Null可の数値カラムが多いテーブルだと
ソースの可読性がかなり下がると思います。

皆さんはいったいどのように対処なされていますか?



Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-06-09 20:12
単に setDecimal(PreparedStatement p, int num, Integer val) のようなラッパメソッドを書けば良いだけではないでしょうか。
Tom
常連さん
会議室デビュー日: 2004/06/07
投稿数: 23
お住まい・勤務地: 東京都
投稿日時: 2004-06-10 10:55
Gio様、ご返答ありがとうございます。
確かにラッパーメソッドを作るのも手ですね。

実は今、SQLを処理するクラスを作っていてSQL文とパラメータとなるOBJECTを渡せば
一括して処理するようなものをテストしてたのですが
例:
#strSQLがSQL文でarrayListParamsがSQLカラムに属したOBJECT
dbclass.update(strSQL, arrayListParams);

みたいな感じでdbclass内部で

pstmt.setObject( arrayListParams.get(i) )

を回せば instanceof の条件判別をしなくてもパラメータを入れれるかなと思っていました。
最低、数値関係は必要みたいですね・・・

Tom
常連さん
会議室デビュー日: 2004/06/07
投稿数: 23
お住まい・勤務地: 東京都
投稿日時: 2004-06-11 09:27
たいしたことではないのですが、JakartaCommonsのDbUtilsを使えば楽ですね。
WEB+DB Pressの今月号(7月号)に載ってました・・・
1

スキルアップ/キャリアアップ(JOB@IT)