【Java・JDBC】INSERT, UPDATE, DELETEを実行する

<!-- タイトルを記述 -->
# INSERT, UPDATE, DELETEを実行する

<!--  記事全体の内容の一言まとめ -->
## 一言まとめ
DB接続からSQLの値を書き換える方法についてのメモです。

<!--  上記の詳しい説明 -->

## executeUpdate()　【戻り値で更新行数を返却】
SQLのINSERT文、UPDATE文、DELETE文の実行は、executeUpdate() メソッドを使用します。
executeUpdate()メソッドは、前処理済みのINSERT文，UPDATE文，およびDELETE文を実行した場合、[戻り値]で更新行数が返却されます。これら以外のSQL文を実行した場合は，0が返却されます。



```java
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()メソッド

第１、第２引数に当てるものは以下です。

- 第１引数: 左から何番目の「?」かを指定
- 第２引数: 値 を指定

## DB接続からUPDATEまでの手順


1. 実行したいSQL文の値を「?」に置き代える
   - 「?」をシングルクォートで囲む必要なし
2. PreparedStaetmentクラスのオブジェクトを取得する。
   - Connectionクラスのオブジェクト.preparedStatement()で取得
   - 引数でSQL文も渡す
3. PreparedStatementクラスのオブジェクト.setHoge()で、?に値を挿入
   - その際、整数型の場合はsetInt()、文字列型の値の場合はsetString()
4. 引数には、?の位置を指定。
	 - SQL文の左側の?から1番目の?なら、第一引数に1
	 - 第二引数には 挿入したい値 を渡す
5. PreparedStatementクラスのオブジェクト.executeQuery()または.executeUpdate()で実行
   - 返却されるResultSetの有無で使用するメソッドが変わる
   - 実行時のexecuteUpdate() メソッドに 引数は要らないので注意
   - select文の場合には、 executeQuery() メソッドで対応する


### 【サンプルコード1】

```java
String SQL = "INSERT INTO テーブル名(列名, 列名, …) VALUES( ?, ?, …) ";
// 上記のSQL文を受け取って接続
PreparedStatement preparedStatement = connection.prepareStatement(SQL);

for (int i = 0; i < 3; i++) {
	  // 値が文字列で、?の位置が左から １番目
    preparedStatement.setString(1, 値);
	  // 値が整数で、?の位置が左から 2番目
    preparedStatement.setInt(2, 値);
    ･･･
		// アップデートを実行する (引数はいらない)
    preparedStatement.executeUpdate();
}
```
### 【サンプルコード2】 カラム「id」の値をしてしてSELECTしたデータを取得

```java
// SQL文を格納する
String SQL = "SELECT カラム名 FROM テーブル名 WHERE id = ?";
Statement st = con.preparedStatement(SQL);
// 下記は「１番目の?の値が１のデータ」と言う意味になる。
st.setInt(1, 1);
//SELECTの場合は、executeQuery() メソッド実行する
ResultSet rs = st.executeQuery();
```

<!-- 今後どうするかなどを有れば記述 -->
## 【まとめ】
色々と手順を踏むことはあるが、カンペを読みながら覚えていこうと思います。
訂正や加筆が必要な部分は遠慮なくお願いいたします。

<!-- 参考にした資料のリンクを貼る -->
## 参考文献・記事

- [executeUpdate()
](http://itdoc.hitachi.co.jp/manuals/3000/3000650220/HAPG0156.HTM)
- [JavaでPreparedStatementを使用する](https://qiita.com/ika_katsuo/items/dfbf9ed227ca08256760)

<!-- 以下ショートリンク↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -->
[Progate]:https://prog-8.com/
[ドットインストール]:https://dotinstall.com/
<!-- A -->
[abstract修飾子]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[abstract]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
<!-- B -->
<!-- C -->
[Calendar]:https://qiita.com/takahirocook/items/204dd7331db777eb6f3b
<!-- D -->
[Date]:https://qiita.com/takahirocook/items/a760e20ef2d9aa5c08fc
<!-- E -->
<!-- F -->
[final]:https://qiita.com/takahirocook/items/5e0916d9bf28bcf68d0c
[final修飾子]:https://qiita.com/takahirocook/items/5e0916d9bf28bcf68d0c
<!-- G -->
[getter・setter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[getter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[GET]:https://qiita.com/takahirocook/items/8080a478439f6043b2c1
[GETメソッド]:https://qiita.com/takahirocook/items/8080a478439f6043b2c1
[getParameter()]:https://qiita.com/takahirocook/items/8080a478439f6043b2c1
[getParameter]:https://qiita.com/takahirocook/items/8080a478439f6043b2c1
[getParameterメソッド]:(https://qiita.com/takahirocook/items/8080a478439f6043b2c1)
[getParameterValues]:https://qiita.com/takahirocook/items/7a071493ae73cc4749e1
[getParameterValuesメソッド]:https://qiita.com/takahirocook/items/7a071493ae73cc4749e1
<!-- H -->
<!-- I -->
[import]:https://qiita.com/takahirocook/items/59a8a09cab6a98d3bca2
<!-- J -->
[JDBC]:https://qiita.com/takahirocook/items/064b591cffa4221144ed
<!-- K -->
<!-- L -->
[List]:https://qiita.com/takahirocook/items/4d622fc6f271569783b5
[length]:https://qiita.com/takahirocook/items/16a123fb73b30869053b
[list]:https://qiita.com/takahirocook/items/4d622fc6f271569783b5
<!-- M -->
[Map]:https://qiita.com/takahirocook/items/49f46151ecb5e332db32
[map]:https://qiita.com/takahirocook/items/49f46151ecb5e332db32
[mainメソッド]:https://qiita.com/takahirocook/items/f4635915337303de338c
<!-- N -->
[new演算子]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
[new]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
<!-- O -->
<!-- P -->
[printf()メソッド]:https://qiita.com/takahirocook/items/06d525be63eccd99ed49
[printf()関数]:https://qiita.com/takahirocook/items/06d525be63eccd99ed49
[POST]:https://qiita.com/takahirocook/items/7a071493ae73cc4749e1
[POSTメソッド]:https://qiita.com/takahirocook/items/7a071493ae73cc4749e1
<!-- Q -->
<!-- R -->
<!-- S -->
[static修飾子]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[static]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[setter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[SimpleDateFormat]:https://qiita.com/takahirocook/items/aa857c8f2153193095e4
[set]:https://qiita.com/takahirocook/items/d498329cd26e1500f476
[Set]:https://qiita.com/takahirocook/items/d498329cd26e1500f476
[super]:https://qiita.com/takahirocook/items/75a07131e7e791c8442c
<!-- T -->
[this]:https://qiita.com/takahirocook/items/d251ec4693c68f6b9538
[Time]:https://qiita.com/takahirocook/items/9caef0bb2409caedba55
[this]:https://qiita.com/takahirocook/items/d251ec4693c68f6b9538
[web.xml]:https://qiita.com/takahirocook/items/d41a92bd36807d456f82
<!-- U -->
<!-- V -->
<!-- W -->
<!-- X -->
<!-- Y -->
<!-- Z -->
<!-- あ行 -->
[オブジェクト指向]:https://qiita.com/takahirocook/items/041ba7a096b71ab8ffd4
[継承]:https://qiita.com/takahirocook/items/6c84ea66a6e2ad536a37
[オーバーライド]:https://qiita.com/takahirocook/items/09dd8e5f56d6617ce45a
[オーバーロード]:https://qiita.com/takahirocook/items/b937c3c07126fe7e02a4
[インスタンス]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[インスタンス化]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[アクセス修飾子]:https://qiita.com/takahirocook/items/e51b0b9d37d95ad587fe
[インスタンス化]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[インスタンス変数]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[インターフェイス]:https://qiita.com/takahirocook/items/ca84be8dfef664b19194
[インターフェース]:https://qiita.com/takahirocook/items/ca84be8dfef664b19194
[インポート]:https://qiita.com/takahirocook/items/59a8a09cab6a98d3bca2
[インデックス]:https://qiita.com/takahirocook/items/16a123fb73b30869053b
<!-- か行 -->
[拡張for文]:https://qiita.com/takahirocook/items/470b2858de1a4f99b334
[クラスメソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[クラスフィールド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[クラス変数]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[カプセル化]:https://qiita.com/takahirocook/items/e469a7c0539a0012868e
[クラス]:https://qiita.com/takahirocook/items/50cbbdca8e21539170e9
[コンストラクタ]:https://qiita.com/takahirocook/items/fa1822f2f22c3786593e
<!-- さ行 -->
[サーブレット]:https://qiita.com/takahirocook/items/1ee780d68fd859e43daf
[書式指定子]:https://qiita.com/takahirocook/items/06d525be63eccd99ed49
[静的メソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[静的変数]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[静的メソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[スーパークラス]:https://qiita.com/takahirocook/items/75a07131e7e791c8442c
<!-- た行 -->
[定数]:https://qiita.com/takahirocook/items/5e0916d9bf28bcf68d0c
[抽象クラス]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[抽象メソッド]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[動的メソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
<!-- な行 -->
[日時の文字列操作]:https://qiita.com/takahirocook/items/aa857c8f2153193095e4
<!-- は行 -->
[パッケージ]:https://qiita.com/takahirocook/items/39b58d17abcb159ef5c1
[引数]:https://qiita.com/takahirocook/items/5e5b0ba79e869f4a592e
[配列]:https://qiita.com/takahirocook/items/16a123fb73b30869053b
[配列操作]:https://qiita.com/takahirocook/items/16a123fb73b30869053b
[日付操作]:https://qiita.com/takahirocook/items/9caef0bb2409caedba55
[フィールド]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[フィールド変数]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[インスタンスフィールド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
<!-- ま行 -->
[戻り値]:https://qiita.com/takahirocook/items/3b6fa670a1d6dd4a9386
[メソッド]:https://qiita.com/takahirocook/items/5bfe43576d87a2a4006c
[メソッドの呼び出し]:https://qiita.com/takahirocook/items/f4635915337303de338c
<!-- や行 -->
<!-- ら行 -->
<!-- わ行 -->