オープンソースで作る Java+DB

特集 オープンソースで作るJava+DB
第2回 コードから学ぶJSPのデータベースアクセスの基礎 (6/8)

 「set型名」メソッドの第1引数は、パラメータクエリー内の「?」が登場する順序によって対応される番号だ。パラメータクエリー内の「?」の部分が、先頭から、1、2、…、のように対応する。

 第2引数は、実際に埋め込みする値になる。この結果、パラメータクエリーには、Fig.3に示すように値が入る。

Fig.3 パラメータクエリーへの値の埋め込み

fig03.gif

 PreparedStatementオブジェクトの「set型名」のメソッドは、列の型によって利用するメソッドが異なる。主なメソッドを表2に示す。

表2 PreparedStatementオブジェクトにおいてパラメータの値をバインドするための主なメソッド(一部のみ抜粋)

メソッド名
setBoolean boolean
setByte byte
setDate Date
setDouble double
setFloat float
setInt int
setLong long
setNull Null値を設定する
setShort short
setString String
setTime Time
setTimestamp Timestamp

 パラメータに値を埋め込んだ後には、以降の処理はリスト2と同じだ。つまり、54行目にあるように「executeUpdate」メソッドを呼び出すと、このクエリーがデータベースに対して送信され、データベース更新されるのだ。

54: int resultCnt = stmt.executeUpdate();

 ユーザーが入力したデータを元にクエリーを生成する場合には、ユーザーが入力したデータにエスケープが必要な文字列が含まれていることを考える必要性がある。単なる文字列連結でクエリーを生成するのではなく、ここで示したように、パラメータクエリーを使ったほうが安全だ。

コラム 自動コミットとトランザクション

 トランザクションに対応するデータベースは、データベースへの書き込みを即有効にせず、まとまった段階で一気に反映させる機能を持っている。この機能を「トランザクション」と呼ぶ。PostgreSQLは、トランザクションに対応している。

 たとえば、複数のクエリーを実行して複数のテーブルやレコードを更新する場合、一部だけが反映されて、一部がエラーなどで反映されないと、テーブルの整合性に支障を来たしてしまう。そのような場合には、トランザクション機能を使い、「すべてのクエリーを送信したあと、一気に反映させる」という処理をするとよい。トランザクション機能を使って、データベースへの更新を反映させることを「コミット」、何らかの理由でデータベースへの更新をとりやめることを「ロールバック」と呼ぶ。

 JDBCでは明示的に操作しない場合、「自動コミット」モードとなっている。自動コミットモードの場合には、クエリーは送信したのち、自動的にコミットされる。すなわち、クエリーを送信したのちに、自動的にデータベースに反映される。

 もし複数の手動でコミットしたいのであれば、自動コミットモードをオフにする操作をすればよい。手動でコミットする場合の手順は、次のようになる。

' 変数connは、Connectionオブジェクトを指していると仮定する
' 自動コミットモードをオフにする
conn.setAutoCommit(false);
' 何らかのデータベースに関する処理をする
' たとえば、
' Statement stmt = conn.CreateStatement();
' stmt.executeUpdate("INSERT INTO …");
' stmt.executeUpdate("DELETE …");などなど
' すべての操作を終えた段階でコミットする
' commitメソッドを呼び出さない限り反映されないので注意
conn.commit();

 自動コミットをオフにするには、setAutoCommitメソッドの引数にfalseを指定すればよい。そしてコミットする時点で、commitメソッドを呼び出す。

 自動コミットをオフにした場合には、明示的にcommitメソッドを呼び出すまで、その結果がデータベースに反映されないという点に注意したい。ちなみに何らかの事情でデータベースへの反映をとりやめるならば、次のようにrollbackメソッドを呼び出せばよい。

' commitする前に呼び出せば、取りやめることができる
conn.rollback();

前のページへ | 1 2 3 4 5 6 7 8 | 次のページへ

[大澤文孝,ITmedia]