package cn.itcast.day04.test;
/**
参数说明:java -jar InsertData.jar 数据库url 表名 文件路径 是否再插入前删除
该方法存在的问题是,读入本地数据后没必要放在二维数组中,这样会大大降低插入的效率,可以分块读入,
每次读几千条,然后插入数据库,并提交。或者使用多线程,还在学习之中。
*/
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ReadFile {
private static String url_unic = "?useUnicode=true&characterEncoding=utf8";
//读取文本文件
public static String[][] writeToDat(String path) {
File file = new File(path);
List<String> list = new ArrayList<String>();
String[][] strings = null;
try {
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf8");
BufferedReader bw = new BufferedReader(isr);
String line = null;
while ((line = bw.readLine()) != null) {
//System.out.println(line);
list.add(line);
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
strings = new String[list.size()][14];
for (int i = 0; i < list.size(); i++) {
String[] st = list.get(i).split("\t");
for (int j = 0; j < st.length; j++) {
strings[i][j] = st[j];
//System.out.println(strings[i][j]);
}
}
System.out.println("load data success!");
return strings;
}
//连接数据库
public static Connection getConnection(String url, String dataBase, String user, String pwd) {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url_total = url + "/" + dataBase + url_unic;
//System.out.println(url_total);
conn = DriverManager.getConnection(url_total, user, pwd);
System.out.println("connection success!");
} catch (Exception e) {
System.out.println("connection fail!");
e.printStackTrace();
}
return conn;
}
//关闭数据库连接
public static void closeCon(Connection con) {
if (con != null) {
try {
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//插入数据
public static boolean insertIntoTable(String url, String dataBase, String user, String pwd, String table, String[][] str) {
Connection conn = getConnection(url, dataBase, user, pwd);
try {
String sql = "insert into " + table + " (" + "inner_account_id,account_id,custom_id,custom_cname,account_type,is_internal,"
+ "first_login_date,last_date,account_mode,is_special_line,account_status,custom_type_id,iwind_type,has_auxiliary"
+ ")" + " values " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
//System.out.println(sql);
for (int i = 0; i < str.length; i++) {
pstmt.setInt(1, Integer.parseInt(str[i][0]));
//System.out.println(str[i][0]);
for (int j = 1; j < str[i].length; j++) {
//System.out.println(str[i][j]);
pstmt.setString(j + 1, str[i][j]);
}
pstmt.executeUpdate();
}
System.out.println("insert data success!");
closeCon(conn);
return true;
} catch (SQLException e) {
e.printStackTrace();
System.out.println("insert data fail!");
closeCon(conn);
return false;
}
}
//删除数据库数据
public static void dropData(String url, String dataBase, String user, String pwd, String table) {
Connection conn = getConnection(url, dataBase, user, pwd);
try {
String sql = "delete from " + table;
//System.out.println(sql);
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
System.out.println("delete data success!");
closeCon(conn);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("delete data fail!");
closeCon(conn);
}
}
public static void main(String[] args) {
/*--------调试-----------//
String path = "E:\\Java\\basic-code\\day04-code\\src\\cn\\itcast\\day04\\test\\a.txt";
String[][] strings = writeToDat(path);
for(int i=0;i<strings.length;i++){
for(int j=0;j<strings[i].length;j++){
System.out.print(strings[i][j]+'\t');
}
System.out.println();
}
*/
String url = args[0];
String table = args[1];
String path = args[2];
String deleteFlag = args[3];
System.out.println(deleteFlag);
String dataBase = "****";
String user = "****";
String pwd = "****";
System.out.println(url);
System.out.println(table);
System.out.println(path);
//将文件数据读入二维数组
String[][] strings = writeToDat(path);
if (deleteFlag.equals("true") | deleteFlag.equals("True")) {
dropData(url, dataBase, user, pwd, table);
}
//创建数据库连接,并向数据库中插入数据
insertIntoTable(url, dataBase, user, pwd, table, strings);
}
}