SQL発行の基本的な手順
前回はデータベースに接続し、そのまま切断しただけでしたが、今回はWriteとReadの処理を1回ずつやってみます。
ソースはこちらです。 https://github.com/chokkoyamada/DigIntoJDBC/tree/chapter3
基本的にはPHPのPDOやPerlのPythonのMySQLdbなどとクエリの発行の構造は同じで、PrepareStatementというオブジェクトを使います。
ConnectionオブジェクトからPrepareedStatementを作成し、そこからクエリを実行、という流れです。
参考: Using Prepared Statements (The Java™ Tutorials > JDBC™ Database Access > JDBC Basics) http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
INSERT文:executeUpdate()メソッドを使う:戻り値は処理レコード数
1 2 3 4 5 6 7 8 9 |
|
connection.prepareStatement()メソッド内でSQLを記述し、”?“をプレイスホルダとして使います。”?“の部分はsetXXXX()メソッド(XXXXの部分は型が入る)のなかで番号に対応する形で値を入れています。
INSERT/UPDATE/DELETE文の発行はexecuteUpdate()メソッドを使います。
疑問:JDBCにはキーワード付プレイスホルダは無いんでしょうか?
SELECT文:executeQuery()メソッドを使う:戻り値はResultSet
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
SELECT文も、connection.prepareStatement()メソッド内でSQLを記述します。
SELECT文の実行には、executeQuery()メソッドを使います。このメソッドはResultSetオブジェクトが返るので、resultSet.next()でループして結果を取得します。
今回はPreparedStatementを使いましたが、下記のように単純なStatementオブジェクトで記述することもできます。
1 2 3 4 5 6 7 |
|
Statementとその派生クラスには3種類あります。
- Statement パラメータを持たない単純なSQLの実行
- PreparedStatement SQLをプリコンパイルして実行する
- CallableStatement プロシージャを呼び出すときに使う
StatementよりPreparedStaementのほうが高速な場合が多いので、SELECT/INSERT/UPDATE/DELETE文のSQLの実行にはPreparedStatementを使うとおぼえておいて基本的に間違いないと思います。
StatementオブジェクトはGCによって自動的にクローズされますが、明示的にclose()を呼んでおくのが良いようです。今回は明示的にclose()を呼んでいます。
ひとまずシンプルにINSERTとSELECTを行なってみました。 次回はSELECTの最適化・高速化という観点から、ResultSetオブジェクトの扱いについて詳しくみてみます。