【実践‼】SQLステートメントの実行

## 1.事前知識
- [【最新】UbuntuでJavaの環境を構築する方法](https://qiita.com/ryome/items/37c53e9638a9c6ea146a)

- [【初心者でもできる‼】Windows10にJava環境を作る方法（JDK14.0.1）](https://qiita.com/ryome/items/30135570954e36196821)

- [【わかりやすく解説‼】Javaのインスタンスの使い方](https://qiita.com/ryome/items/62ba0d8395af6698053a)

- [【初心者でもできる‼】Windows10にEclipseをインストールする方法（Java環境構築）](https://qiita.com/ryome/items/b47c5acdaa52cffbec58)

- [【初心者でもできる‼】Windows10にMySQLをインストールする方法（MySQL Server 8.0.20）](https://qiita.com/ryome/items/68766f81f0668ff6876b)

- [【実践‼】Javaデータベース連携（Connector/J 8.0.20）](https://qiita.com/ryome/items/c78534200ae725ad571b)


事前知識として、上記リンクの内容が必要です。

## 2.基本的な書き方

```PHP:更新系SQL
public class クラス名 {
	public static void main(String[] args) {
		try {
			/* コネクション */
			Connection con = DriverManager.getConnection(データベースのURL, データベースのユーザ名, データベースのパスワード);
			/* ステートメント */
			PreparedStatement pstmt = con.prepareStatement(SQL文);

			// SQL文に値の代入
			pstmt.setString(何番目の?か, 値);

			/* SQL文の実行 */
			pstmt.executeUpdate(); 

		} catch (SQLException e) {
			// SQLのエラー発生時の処理
		}
	}
}
```

```PHP:参照系SQL
public class クラス名 {
	public static void main(String[] args) {
		try {
			/* コネクション */
			Connection con = DriverManager.getConnection(データベースのURL, データベースのユーザ名, データベースのパスワード);
			/* ステートメント */
			PreparedStatement pstmt = con.prepareStatement(SQL文);

			// SQL文に値の代入
			pstmt.setString(何番目の?か, 値);

			// SQL文の実行
			ResultSet res = pstmt.executeQuery();

			// ResultSetの操作
			while (res.next()) {
				// 実行結果の表示
			}

		} catch (SQLException e) {
			// SQLのエラー発生時の処理
		}
	}
}
```

- 基本的なSQLステートメントの実行は上記のように記述する。


## 3.事前準備
※[【実践‼】Javaデータベース連携（Connector/J 8.0.20）](https://qiita.com/ryome/items/c78534200ae725ad571b) で `データベースの設定` を行っていることを前提にしています。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/433a59e6-de44-cc00-99cc-57b0c59b5850.png)
1. Eclipseを起動後、 `[新規(N)]→[Javaプロジェクト]` を選択する。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/d1a0a14b-efd1-0fff-3d72-fd00eb9b0e31.png)
2. プロジェクト名に `TestDB` と入力し、実行環境JREの使用を `JavaSE-1.8` を選択して、 `完了` ボタンをクリックする。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/77bf387a-f038-05ff-0aa8-27a01acac1e6.png)
3. `[新規(N)]→[クラス]` を選択する。　　　
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/7da6e31c-c654-90c2-0ece-b2fcbb5ca73b.png)
4. パッケージに `db`, 名前に `Test1` と入力し、 `public static void main(String[] args)` にチェックを付け、 `完了` ボタンをクリックする。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/2cdc1794-7d1b-ca06-13fc-908113c238b0.png)
5. プロジェクトを `右クリック` して  `[ビルド・パス(B)]→[外部アーカイブの追加(V)]` を選択する。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/235b1174-efff-0def-f2b7-81299bac513b.png)
6. `C:\Program Files\MySQL\mysql-connector-java-8.0.20` の `mysql-connector-java-8.0.20.jar` を選択する。


## 4.記述例

- 参照（SELECT文）

```java:Test1.java
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test1 {
	public static void main(String[] args) {
		/* データベースURL */
		String url = "jdbc:mysql://localhost/test?characterEncoding=UTF-8&useSSL=false";

		/* データベースのユーザとパスワード */
		String user = "test";
		String password = "test";

		/* SQL文 */
		String sql = "SELECT * FROM test1";

		try {
			/* コネクション */
			Connection con = DriverManager.getConnection(url, user, password);
			/* ステートメント */
			PreparedStatement pstmt = con.prepareStatement(sql);

			// SQL文の実行
			ResultSet res = pstmt.executeQuery();

			// ResultSetの操作
			while (res.next()) {
				// 実行結果の表示
				System.out.print("ID：" + res.getInt("id") + " ");
				System.out.print("名前：" + res.getString("name") + "\n");
			}
		} catch (SQLException e) {
			// SQLのエラー発生時の処理
			e.printStackTrace();
		}
	}
}
```

- 登録（INSERT文）

```java:Test1.java
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test1 {
	public static void main(String[] args) {
		/* データベースURL */
		String url = "jdbc:mysql://localhost/test?characterEncoding=UTF-8&useSSL=false";

		/* データベースのユーザとパスワード */
		String user = "test";
		String password = "test";

		/* SQL文 */
		String sql = "INSERT INTO test1 (name) VALUE (?)";

		try {
			/* コネクション */
			Connection con = DriverManager.getConnection(url, user, password);
			/* ステートメント */
			PreparedStatement pstmt = con.prepareStatement(sql);

			// プレースホルダに値の設定
			pstmt.setString(1,"test5");

			// SQL文の実行（更新）
			pstmt.executeUpdate();

			// SQL文の更新
			sql = "SELECT * FROM test1";

			/* ステートメント */
			pstmt = con.prepareStatement(sql);

			// SQL文の実行（参照）
			ResultSet res = pstmt.executeQuery();

			// ResultSetの操作
			while (res.next()) {
				// 実行結果の表示
				System.out.print("ID：" + res.getInt("id") + " ");
				System.out.print("名前：" + res.getString("name") + "\n");
			}
		} catch (SQLException e) {
			// SQLのエラー発生時の処理
			e.printStackTrace();
		}
	}
}
```

- 変更（UPDATE文）

```java:Test1.java
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test1 {
	public static void main(String[] args) {
		/* データベースURL */
		String url = "jdbc:mysql://localhost/test?characterEncoding=UTF-8&useSSL=false";

		/* データベースのユーザとパスワード */
		String user = "test";
		String password = "test";

		/* SQL文 */
		String sql = "UPDATE test1 SET name = ? WHERE id = ?";

		try {
			/* コネクション */
			Connection con = DriverManager.getConnection(url, user, password);
			/* ステートメント */
			PreparedStatement pstmt = con.prepareStatement(sql);

			// プレースホルダに値の設定
			pstmt.setString(1,"testX");
			pstmt.setInt(2,2);

			// SQL文の実行（更新）
			pstmt.executeUpdate();

			// SQL文の更新
			sql = "SELECT * FROM test1";

			/* ステートメント */
			pstmt = con.prepareStatement(sql);

			// SQL文の実行（参照）
			ResultSet res = pstmt.executeQuery();

			// ResultSetの操作
			while (res.next()) {
				// 実行結果の表示
				System.out.print("ID：" + res.getInt("id") + " ");
				System.out.print("名前：" + res.getString("name") + "\n");
			}
		} catch (SQLException e) {
			// SQLのエラー発生時の処理
			e.printStackTrace();
		}
	}
}
```

- 削除（DELETE文）

```java:Test1.java
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test1 {
	public static void main(String[] args) {
		/* データベースURL */
		String url = "jdbc:mysql://localhost/test?characterEncoding=UTF-8&useSSL=false";

		/* データベースのユーザとパスワード */
		String user = "test";
		String password = "test";

		/* SQL文 */
		String sql = "DELETE FROM test1 WHERE id = ?";

		try {
			/* コネクション */
			Connection con = DriverManager.getConnection(url, user, password);
			/* ステートメント */
			PreparedStatement pstmt = con.prepareStatement(sql);

			// プレースホルダに値の設定
			pstmt.setInt(1,3);

			// SQL文の実行（削除）
			pstmt.executeUpdate();

			// SQL文の更新
			sql = "SELECT * FROM test1";

			/* ステートメント */
			pstmt = con.prepareStatement(sql);

			// SQL文の実行（参照）
			ResultSet res = pstmt.executeQuery();

			// ResultSetの操作
			while (res.next()) {
				// 実行結果の表示
				System.out.print("ID：" + res.getInt("id") + " ");
				System.out.print("名前：" + res.getString("name") + "\n");
			}
		} catch (SQLException e) {
			// SQLのエラー発生時の処理
			e.printStackTrace();
		}
	}
}
```

上記の文をコピーして、文字コードは `S-JIS` を指定し、ファイル名を `Test1.java` で保存し、実行するとこうなります。↓↓　　

- 参照（SELECT文）
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/c1cf0acd-02ca-0e1c-5ecc-6b3a0fa5692f.png)

- 登録（INSERT文）
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/5e65cfe2-68d4-728c-dace-3c2c32a528e9.png)

- 変更（UPDATE文）
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ecba3c73-ac3a-b71a-655b-2da332ad04cf.png)

- 削除（DELETE文）
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/117932f8-7694-13bc-962b-6bd7e4748bd0.png)

## 5.GitHub
GitHubにソースコードを公開しています。

https://github.com/ryomeblog/qiita/tree/master/%E3%80%90%E5%AE%9F%E8%B7%B5%E2%80%BC%E3%80%91SQL%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9F%E8%A1%8C



## 6.関連
- [【覚えておくと便利!!!】Eclipseにおけるコンストラクタとgetter/setterの簡易作成](https://qiita.com/ryome/items/6c487ccc0c39847cd55f)
- [【覚えておくと便利!!!】Eclipseにおける継承クラスの簡易作成](https://qiita.com/ryome/items/4fcf62b4bc60fb6a4d07)
- [【覚えておくと便利!!!】MySQLの文字コード変更](https://qiita.com/ryome/items/b1f0f7055d2d614fb605)
- [【初心者でもできる‼】Javadocの書き方](https://qiita.com/ryome/items/4f2d5928c8aaf195f407)
- [【わかりやすく解説‼】Javaのオーバーロードの使い方](https://qiita.com/ryome/items/f1ca8cc7538f4c6d26c0)
- [【わかりやすく解説‼】Javaのカプセル化の使い方](https://qiita.com/ryome/items/fc44dfad297b35bf7559)
- [【わかりやすく解説‼】Javaの継承の使い方【オーバーライドの解説あり】](https://qiita.com/ryome/items/97b82c5519e39d3f21c1)
- [【わかりやすく解説‼】Javaにおける参照型の型変換](https://qiita.com/ryome/items/2453949b978bf166e204)
- [【わかりやすく解説‼】Javaのポリモーフィズムの使い方](https://qiita.com/ryome/items/a22457797988c548ec62)
- [【わかりやすく解説‼】ArrayListの使い方【Java】](https://qiita.com/ryome/items/cc01a7b6914e5b8b1579)
- [【実践‼】JFrameの導入（画面作成まで解説）](https://qiita.com/ryome/items/a45e0db4f7456e62d8d8)