PostgreSQL使用jdbc匯入csv檔案
阿新 • • 發佈:2021-01-26
技術標籤:Javapostgresql
在windows版的pgAdmin中,可以輕鬆的匯入資料,但是如果要在pgAdmin的介面中用命令來匯入的話就不好辦了(使用cmd copy命令除外)
這裡介紹一下如何使用JDBC的方式來匯入一個csv檔案到資料庫表
init.sql
CREATE TABLE public.test (
id character varying NOT NULL,
name character varying
);
INSERT INTO public.test VALUES ('1', 'Daniel');
INSERT INTO public .test VALUES ('2', 'Lily');
input.csv
id,name
3,Jack
4,Rose
Maven依賴
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>
LoadCSVFile.java
package dao;
import org.postgresql. copy.CopyManager;
import org.postgresql.core.BaseConnection;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
/**
* @Author Daniel
* @Description 匯入csv檔案到資料庫表
**/
public class LoadCSVFile {
private Connection connection = null;
public Connection getConnection() {
try {
// 註冊postgresql驅動
Class.forName("org.postgresql.Driver").newInstance();
//url、使用者名稱、密碼
String url = "jdbc:postgresql://localhost:5432/test";
String username = "postgres";
String password = "123456";
connection = DriverManager.getConnection(url, username, password);
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return connection;
}
// 執行多條SQL語句
public void executeSQL(Connection conn, String[] sqlArray) {
// 直接返回Statement物件
Statement statement;
try {
statement = conn.createStatement();
for (String sql : sqlArray) {
statement.addBatch(sql);
}
statement.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void close(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException, IOException {
LoadCSVFile load = new LoadCSVFile();
Connection conn = load.getConnection();
// 查看錶中目前的資料,並清空表
String[] initArray = {"truncate table test"};
load.executeSQL(conn, initArray);
// 這裡的核心就是使用org.postgresql.copy.CopyManager類來完成copy操作
CopyManager copyManager = new CopyManager((BaseConnection) conn);
FileReader fileReader = new FileReader("C:/input.csv");
// 匯入帶有表頭的資料
long rows = copyManager.copyIn("COPY TEST FROM STDIN WITH CSV HEADER", fileReader);
System.out.println("INSERT " + rows + "\n\nQuery returned successfully.");
load.close(conn);
}
}