0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

##目的
初めてバッチ処理のようなものを作ったので備忘録として記述。
挙動は以下の通り。
・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

公式APIマニュアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?