【Java】SQLを実行する ( データの格納 )

<!-- タイトルを記述 -->
# SQLを実行する

<!--  記事全体の内容の一言まとめ -->
## 一言まとめ
SQLから取得したデータの格納についてメモです。

<!--  上記の詳しい説明 -->
## 【説明】
WEB画面の裏側には大体なにかデータベースが存在してプログラムで制御しています。
例えば、入力フォームに郵便番号を入れるだけで続きの住所がドバっと入力されたりする仕組みは以下のような流れです。

1. 値が画面で入力される
2. プログラミングがデータベースでSQLを実行する
3. データベースから住所の情報が返ってくる
4. プログラムが受けとってWEB画面に表示する

## Step1 : 主要インタフェース

## SQLのパッケージをインポート
[パッケージ]宣言のあとに、SQL関連の[インポート]を記述します。

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
```

## DBに接続するための値をフィールドで定数化
後々でDB接続に使う値を[定数]化します。

```java
    // ドライバーのクラス名
    private static final String POSTGRES_DRIVER = "org.postgresql.Driver";
    // JDMC接続先情報
    private static final String JDBC_CONNECTION = "jdbc:postgresql://localhost:5432/データベース名";
    // ユーザー名
    private static final String USER = "ユーザー名";
    // パスワード
    private static final String PASS = "パスワード";
```

## 接続先情報、問い合わせ結果、実行結果のデータの初期値を 「null」に

- connection: 接続先の情報


```java
// 接続先の情報を null
Connection connection = null;
// 問い合わせ取得結果を null
Statement statement = null;
// 実行結果のデータを　null
ResultSet resultSet = null;
```
## Class.forName()
JDBCドライバをロードします。データベースに接続する準備の記述。
Class.forName()メソッドにJDBCドライバ名を与えます。

```java
// データベースに接続する準備。
// Class.forName()メソッドにJDBCドライバ名を与えJDBCドライバをロード
Class.forName(POSTGRES_DRIVER);
// 接続先の情報。引数:「JDMC接続先情報」,「ユーザー名」,「パスワード」
connection = DriverManager.getConnection(JDBC_CONNECTION, USER, PASS);
```

## Statementインタフェース【SQLの実行】

StatementインタフェースはSQLの実行に関するベースにになります。
 
- 問い合わせを実行
- 問い合わせの結果の取得

といった操作をしたい時にを使用します。

```java	
// ステートメントの作成
statement = connection.createStatement();
// 「テーブル内のデータを出力する」SQL文の変数化
String SQL = "SELECT * FROM テーブル名";
// 引数で指定したSQLを実行して、実行結果を格納
resultSet = statement.executeQuery(SQL);
```

### createStatement"メソッド【ステートメントの作成】
ステートメントは「java.sql.Statement」インターフェースのオブジェクトですが、作成するには Connectionクラスの 「createStatement()メソッド」で取得します。

### executeQuery()メソッド 【引数で指定したSQLをDBで実行】
executeQuery()メソッドは、引数で指定されたSQLをデータベースで実行するメソッドです。
問題なく処理が完了すると、SQLの実行結果を格納したResultSet型のオブジェクトを返します。

## ResultSetインタフェース 【SQLの実行結果とデータの取得・格納】
上記のようににResultSetは以下の機能ももっています。

- SQLの実行結果を格納する
- DB情報を取得する 

### next()メソッド 【resultSetの初期位置を移動】
resultSetは 「 必ずnext()メソッド で最初の行に移動 」してあげましょう。

whileで回そうとした時には、結果の2行目にカーソルが当たってしまい、
resultSetは初期状態では、最初の行の1つ前に位置しています。そのままSQLを叩くとwhileで回そうとした時には、結果の2行目にカーソルが当たってしまい、
結果の1行目はリストに追加されないため、「コマンドでSQL叩くより1行少なくなる」といった事が起きます。

next()メソッド は、該当する行が存在する場合にのみ true を返します。
下記のようにwhile文と組み合わせて使うことにより、
実行結果を格納した情報を先頭から最後尾まで順に追っていくことができます。

```java
// next()メソッド （次の行に移動する）で最初の行に移動する
// while文で実行結果の情報を先頭から最後尾まで順に追う
while (resultSet.next()) {
    String column1 = resultSet.getString("列名");
    String column2 = resultSet.getString("列名");
    int column3 = resultSet.getInt("列名");
}
```

## getXXX()メソッド
該当する行の任意の列の取得には、「getXXX()」メソッドを使用します。
データ型によって以下のメソッドで使い分けます。

- 文字列： getString()メソッド
- 整数： getInt()メソッド, getLong()メソッド
- 日付：  getDate()メソッド


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

- [データの取得(SELECT)](https://www.javadrive.jp/servlet/database/index6.html)
- [【Java】ResultSetインターフェース](https://ittech-nsnl.hatenablog.com/entry/2019/11/23/005052)
- [Resultsetのnext()は、"ResultSetの次があるかどうかを判定するメソッド"ではない。](https://qiita.com/AIN/items/ff3b48fe9a61f5cd297f)



<!-- 以下ショートリンク↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -->
[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
<!-- や行 -->
<!-- ら行 -->
<!-- わ行 -->