JDBC:CSV原始数据使用流从/向远程MySQL数据库导出/导入(SELECT INTO OUTFILE / LOAD DATA INFILE)

时间:2012-01-20 17:30:09

标签: java mysql jdbc stream

我目前正在开发的Web应用程序支持CSV导出(使用SELECT INTO OUTFILE)并导入(使用LOAD DATA INFILE)MySQL服务器以维护使用SELECT和批量INSERT语句处理极其昂贵的大量数据集在Java代码中(处理结果集,字符串编码东西,业务逻辑遗产等)。这些CSV文件不是应用程序驱动的,因此它们只代表MySQL数据库中的原始表内容。但据我所知,这种方法只有在我有本地文件时才有用,所以web应用服务器和mysqld都必须在同一台机器上运行。

应用程序配置可以指定远程数据库连接。这显然意味着上传的CSV文件存储在运行Web应用程序的机器本地的某处,因此我无法在MySQL LOAD DATA INFILE语句中指定数据文件位置。 (相同的方案是CSV下载请求)。所以,我试图找到的方法是“虚拟地”指定CSV文件 - 使用可由JDBC和MySQL处理的I / O流,类似于blob管理等。

JDBC / MySQL是否支持这种用于导入和导出CSV文件的技术?

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以使用LOCAL选项运行LOAD DATA INFILE,然后使用com.mysql.jdbc.Statement#setLocalInfileInputStream从运行MySQL JDBC客户端的位置加载CSV文件。例如:

// conn is an existing java.sql.Connection to a remote server
try (Statement st = conn.createStatement()) {
    String localCsvFileSpec = "C:/Users/Jamie/Desktop/foo.csv";  // on this machine
    ((com.mysql.jdbc.Statement) st).setLocalInfileInputStream(
            new FileInputStream(localCsvFileSpec));
    st.execute(
            "LOAD DATA LOCAL INFILE '(placeholder)' " + 
            "INTO TABLE table01 " +
            "COLUMNS TERMINATED BY ',' " +
            "(id, txt) " + 
            "");
}

有关详细信息,请参阅this post

不幸的是,您似乎无法使用SELECT INTO OUTFILE从this answer on Stack Overflow导出除数据库服务器以外的任何位置的文件。