##目的
初めてバッチ処理のようなものを作ったので備忘録として記述。
挙動は以下の通り。
・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ファイルの書き出しもできたが、これでバッチ処理ができたと勘違いし、ドヤ顔でいたのが恥ずかしい。