1

我正在尝试向显示来自 MySQL 数据库的数据的 web 应用程序添加“导出到 CSV”功能。我编写了一个“queryExecuter”类来执行来自我的 servlet 的查询。我已经用它成功地执行了插入查询,所以我知道连接有效等等,但是使用“into outfile”语句的查询根本没有执行。这是我的代码,

java类...

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;

public class queryExecuter {
    public void exportToCSV(String query) {
        DBase db = new DBase();
        Connection conn = db.connect(
               mydatabaseurl ,"myusername","mypassword");

        db.exportData(conn,query);
    }

}

class DBase {
    public DBase() {
    }

    public Connection connect(String db_connect_str,
            String db_userid, String db_password) {
        Connection conn;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(db_connect_str,
                    db_userid, db_password);

        } catch(Exception e) {
            e.printStackTrace();
            conn = null;
        }
        return conn;
    }

    public void exportData(Connection conn,String query) {
        Statement stmt;

        try {
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);

            stmt.execute(query);

        } catch(Exception e) {
            e.printStackTrace();
            stmt = null;
        }
    }
};

小服务程序...

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class MyExportServlet extends HttpServlet {

  public void doPost(HttpServletRequest request, HttpServletResponse response)

     throws IOException, ServletException {

            String query = "select into outfile 'theoutfile.txt' * from mytable;";

            request.setAttribute("query", query);

            queryExecuter mydata = new queryExecuter();

            mydata.exportToCSV(query);

            RequestDispatcher view = request.getRequestDispatcher("ConfirmationPage.jsp");

            view.forward(request, response);
    }
}

任何帮助将不胜感激。

谢谢

4

2 回答 2

1

你是如何断定它没有执行的?

让我猜猜,文件没有写在你期望的地方?这是非常正确的,因为您的代码使用相对磁盘文件系统路径,'theoutfile.txt'而不是绝对文件系统路径,'c:/theoutfile.txt'并且类似地也可能new File('theoutfile.txt')

相对磁盘文件系统路径是相对于当前工作目录的,这取决于您启动应用程序的方式(在命令行中、作为服务、在服务器中等)。编程时永远不要依赖它。始终使用绝对磁盘文件系统路径。

在 MySQL 中,文件的实际根目录可能是 c:/mysql/bin,而在 webapp(servlet)中,文件的实际根目录可能是 c:/webserverinstallationfolder/webapps. 相对路径没有什么是确定的。不要使用它们。

于 2010-01-04T14:35:45.543 回答
0

通常你会执行查询,并得到一个 ResultSet。您可以读取 ResultSet 并将内容写入文件(使用 Java)。这很好(tm),因为 Java 服务器通常在另一台机器上作为数据库,而 outfile 总是在数据库机器上。

除了那个智慧:)你应该做

select * into outfile

并不是

select into outfile *

也可能是你甚至必须做

select <entire_query> into outfile

请参阅使用 java和MySQL Select 语法导出到 CSV

于 2010-01-04T14:35:40.357 回答