INSERT, UPDATE, DELETEを実行する
一言まとめ
DB接続からSQLの値を書き換える方法についてのメモです。
executeUpdate() 【戻り値で更新行数を返却】
SQLのINSERT文、UPDATE文、DELETE文の実行は、executeUpdate() メソッドを使用します。
executeUpdate()メソッドは、前処理済みのINSERT文,UPDATE文,およびDELETE文を実行した場合、戻り値で更新行数が返却されます。これら以外のSQL文を実行した場合は,0が返却されます。
Statement statement = connection.createStatement();
String SQL = "INSERT INTO テーブル名(カラム名, カラム名, ...) VALUES( 値, 値, ...) ";
statement.executeUpdate(SQL);
PreparedStatementインタフェース
PreparedStatementインタフェースとは
PreparedStatementインタフェース は、何回もSQL文を生成しなくても済むように改良されたクラスです。
PreparedStatementクラスのメリット 【処理が早い】
DB接続の処理を PreparedStatementクラスを使用するのが流行っているようで、その理由は以下です。
- SQLインジェクション対策になる
- SQLがDBにキャッシュされるので同じSQL文を発行する場合処理速度が速い
【使用方法】PreparedStatementクラスの使用方法
PreparedStatementインタフェースは、 prepareStatement() メソッドにSQL文の引数を指定して生成します。
引数に指定するのは、以下のような実行したいSQL文の値を?に置き換えたSQL文です。
String SQL = "INSERT INTO テーブル名(列名, 列名, …) VALUES( ?, ?, …) ";
setXXX()メソッド
該当する行の任意の列の取得には、「setXXX()」メソッドを使用します。
データ型によって以下のメソッドで使い分けます。
- 文字列など: setString()メソッド
- 整数: setInt()メソッド, setLong()メソッド
- 日付: setDate()メソッド
第1、第2引数に当てるものは以下です。
- 第1引数: 左から何番目の「?」かを指定
- 第2引数: 値 を指定
DB接続からUPDATEまでの手順
- 実行したいSQL文の値を「?」に置き代える
- 「?」をシングルクォートで囲む必要なし
- PreparedStaetmentクラスのオブジェクトを取得する。
- Connectionクラスのオブジェクト.preparedStatement()で取得
- 引数でSQL文も渡す
- PreparedStatementクラスのオブジェクト.setHoge()で、?に値を挿入
- その際、整数型の場合はsetInt()、文字列型の値の場合はsetString()
- 引数には、?の位置を指定。
- SQL文の左側の?から1番目の?なら、第一引数に1
- 第二引数には 挿入したい値 を渡す
- PreparedStatementクラスのオブジェクト.executeQuery()または.executeUpdate()で実行
- 返却されるResultSetの有無で使用するメソッドが変わる
- 実行時のexecuteUpdate() メソッドに 引数は要らないので注意
- select文の場合には、 executeQuery() メソッドで対応する
【サンプルコード1】
String SQL = "INSERT INTO テーブル名(列名, 列名, …) VALUES( ?, ?, …) ";
// 上記のSQL文を受け取って接続
PreparedStatement preparedStatement = connection.prepareStatement(SQL);
for (int i = 0; i < 3; i++) {
// 値が文字列で、?の位置が左から 1番目
preparedStatement.setString(1, 値);
// 値が整数で、?の位置が左から 2番目
preparedStatement.setInt(2, 値);
・・・
// アップデートを実行する (引数はいらない)
preparedStatement.executeUpdate();
}
【サンプルコード2】 カラム「id」の値をしてしてSELECTしたデータを取得
// SQL文を格納する
String SQL = "SELECT カラム名 FROM テーブル名 WHERE id = ?";
Statement st = con.preparedStatement(SQL);
// 下記は「1番目の?の値が1のデータ」と言う意味になる。
st.setInt(1, 1);
//SELECTの場合は、executeQuery() メソッド実行する
ResultSet rs = st.executeQuery();
【まとめ】
色々と手順を踏むことはあるが、カンペを読みながら覚えていこうと思います。
訂正や加筆が必要な部分は遠慮なくお願いいたします。