sql语句“进入outfile”不能使用jdbc

时间:2010-01-04 14:28:39

标签: java mysql sql jdbc into-outfile

我正在尝试向显示来自MySQL数据库的数据的webapp添加“导出到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;
        }
    }
};

servlet ......

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);
    }
}

非常感谢任何帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

select * into outfile

而不是

select into outfile *

也可能是你必须要做的

select <entire_query> into outfile

请参阅Export to CSV with javaMySQL Select syntax

答案 1 :(得分:0)

你怎么断定它没有执行?

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

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

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