特集 オープンソースで作るJava+DB
第2回 コードから学ぶJSPのデータベースアクセスの基礎 (6/8)
「set型名」メソッドの第1引数は、パラメータクエリー内の「?」が登場する順序によって対応される番号だ。パラメータクエリー内の「?」の部分が、先頭から、1、2、…、のように対応する。
第2引数は、実際に埋め込みする値になる。この結果、パラメータクエリーには、Fig.3に示すように値が入る。
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]