[備忘録]バッチ処理的なものを作成

##目的
初めてバッチ処理のようなものを作ったので備忘録として記述。
挙動は以下の通り。
・CSVファイルからデータを受け取り、DBへインサート。
・DBの内容を受け取り、CSVファイルとして保存。

##用語
Q . バッチ処理とは？
A . 任意のタイミングでデータの処理を自動で行うプログラムのこと。

Q . CSVファイルとは？
A . 「,」で区切られたテキストデータのこと。

##コード
・CSVファイルからデータを受け取り、DBへインサート。

この挙動を実現するコードが以下の通り。

```InsertItemCSV.java
package com.example.common;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class InsertItemCSV {
	public static void main(String[] args) {
		// 入力値のバイト(容量)を取得するクラス
		FileInputStream fi = null;
		// 受け取ったバイトから文字を復元
		InputStreamReader is = null;
		// 文字列を効率的に読むクラス
		BufferedReader br = null;

		try {
			// MySQLを呼び出すためのドライバを設定
			Class.forName("org.postgresql.Driver");

			// MySqlの接続のためにURL,ユーザー名、パスワードを変数に入れる
			String url = "jdbc:postgresql://localhost:5432/student";
			String user = "postgres";
			String password = "postgres";

			// URL,ユーザー名、パスワードを用いてMySqlに接続
			Connection connection = DriverManager.getConnection(url, user, password);

			// ステートメント(Updateなどの処理を呼び出すもの)を作成
			Statement stmt = connection.createStatement();

			// 1行ずつcsvファイルを読み込む
			try {
				// FileInputStream等をインスタンス化して、
				// csvフォイルを読み込む
				fi = new FileInputStream("item_20210701_001.csv");
				is = new InputStreamReader(fi);
				br = new BufferedReader(is);

				// 読み込み行
				String line;
				// 分割後の(後に , で区切る)データ保持のための配列
				String[] data = null;

				// 1行ずつcsvファイルを読み込み、Insertを行う
				while ((line = br.readLine()) != null) {
					// ,(コンマ)区切りで情報を分ける
					data = line.split(",", 0);

					// ItemsテーブルにInsertを行う
					stmt.executeUpdate(
							"INSERT INTO items(id, name, description, price_m, price_l, image_path, deleted) VALUES ("
									+ data[0] + ",'" + data[1] + "','" + data[2] + "','" + data[3] + "','" + data[4]
									+ "','" + data[5] + "','" + data[6] + "')");
				}

				// Insertが終わり次第、ファイルを閉じる
				br.close();

			} catch (IOException io) {
				System.out.println(io);
			} finally {
				br.close();
			}

			// ステートメントをクローズ
			stmt.close();
			// 接続をクローズ
			connection.close();

		} catch (Exception e) {
			System.out.println(e);
		}
	}
}
```

・DBの内容を受け取り、CSVファイルとして保存。

この挙動を実現するコードが以下の通り。

```OutputOrders_and_UsersCSV.java
package com.example.common;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class OutputOrders_and_UsersCSV {
	public static void main(String[] args) {
		try {
			// 保存先とファイル名設定
			PrintWriter pw = new PrintWriter(new File("/Users/nayuta/Desktop/test1.csv"));
			StringBuilder sb = new StringBuilder();

			// SQLへの接続のためのCOnnectionクラスに、CONNECTION_DBで作ったMethodの値を格納
			Connection connection = null;
			CONNECTION_DB conection_db = new CONNECTION_DB();
			connection = conection_db.getConnection();

			// 実行のためのrs準備
			ResultSet rs = null;

			// SQL文作成
			String sql = "select id, user_id, status, total_price, order_date,  destination_name, destination_email, destination_zipcode, destination_address, destination_tel, delivery_time, payment_method from orders;";
			//
			PreparedStatement ps = connection.prepareStatement(sql);
			// sql文を実行
			rs = ps.executeQuery();

			System.out.println(rs);

			// 繰り返し処理
			while (rs.next()) {
				sb.append("id");
				sb.append(rs.getString("id"));
				sb.append(",");
				sb.append(rs.getString("user_id"));
				sb.append(",");
				sb.append(rs.getString("status"));
				sb.append(",");
				sb.append(rs.getString("total_price"));
				sb.append(",");
				sb.append(rs.getString("order_date"));
				sb.append(",");
				sb.append(rs.getString("destination_name"));
				sb.append(",");
				sb.append(rs.getString("destination_email"));
				sb.append(",");
				sb.append(rs.getString("destination_zipcode"));
				sb.append(",");
				sb.append(rs.getString("destination_address"));
				sb.append(",");
				sb.append(rs.getString("destination_tel"));
				sb.append(",");
				sb.append(rs.getString("delivery_time"));
				sb.append(",");
				sb.append(rs.getString("payment_method"));
				sb.append("\n"); // 改行
			}

			// 保存場所/ファイル名(=pw)に内容(=bf)を格納
			pw.write(sb.toString());
			pw.close();

			System.out.println("保存が完了しました。");

		} catch (FileNotFoundException fe) {
			System.out.println(fe);
		} catch (SQLException sql_e) {
			System.out.println(sql_e);
		}
	}
}

```
こちらはDBへの接続の役割を担うクラス。

```CONNECTION_DB.java
package com.example.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CONNECTION_DB {
	public static void main(String[] args) {
		// 下記のオブジェクト呼び出し
		CONNECTION_DB conect_bd = new CONNECTION_DB();

		System.out.println(conect_bd.getConnection());
	}

	public Connection getConnection() {
		Connection connection = null;

		try {
			// MySQLを呼び出すためのドライバを設定
			Class.forName("org.postgresql.Driver");

			// MySqlの接続のためにURL,ユーザー名、パスワードを変数に入れる
			String url = "jdbc:postgresql://localhost:5432/student";
			String user = "postgres";
			String password = "postgres";

			// URL,ユーザー名、パスワードを用いてMySqlに接続
			connection = DriverManager.getConnection(url, user, password);

		} catch (ClassNotFoundException cn) {
			System.out.println(cn);
		} catch (SQLException sql_e) {
			System.out.println(sql_e);
		}

		return connection;
	}

}

```

[改善点]
・MVCモデルと全く関係ない
・常駐のプログラムではない

RepositoryもServiceもControllerもつかっていないので、ただのJavaの実行ファイル。0点。

CSVファイルからInsertも、DBからCSVファイルの書き出しもできたが、これでバッチ処理ができたと勘違いし、ドヤ顔でいたのが恥ずかしい。

[参考文献]
[Export MySQL Table in to CSV file using JAVA
](https://www.youtube.com/watch?v=b_KN2XAWtwQ&t=389s)

[公式APIマニュアル](https://docs.oracle.com/javase/jp/11/docs/api/)