【问题标题】:resultset print to txt file结果集打印到txt文件
【发布时间】:2014-09-03 16:26:52
【问题描述】:

我想将我的查询结果打印到 .txt 文件中。 怎么做?我尝试使用或不使用 .tostring 打印它,但这仍然不是我想要的结果。

这是我的代码

try {
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ta", "root", "root");
    Statement st = con.createStatement();
    String query = "select count(no) as 'jumlah',kelompok from email group by kelompok";
    //System.out.println(query);
    ResultSet rs = st.executeQuery(query);

    while (rs.next()) {
        dataset.setValue( Integer.parseInt(rs.getString(1)), "Jumlah", rs.getString(2));
    }
    try {
        PrintStream out = new PrintStream(new FileOutputStream("OutFile.txt"));
        String jumlahemail = "select count(*) from email";
        ResultSet rs1 = st.executeQuery(jumlahemail);
        out.println("E-mail yang diterima adalah sebanyak: "+rs1.toString());
        out.println("Dengan detail: ");
        out.println(rs.toString());
        out.close();
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
} catch (SQLException ex) {
    Logger.getLogger(GUI.Home.class.getName()).log(Level.SEVERE, null, ex);
}

这样的结果是:

E-mail yang diterima adalah sebanyak: com.mysql.jdbc.JDBC4ResultSet@81c868
Dengan detail: 
com.mysql.jdbc.JDBC4ResultSet@8c241a

如何正确地做到这一点?

【问题讨论】:

    标签: java mysql resultset


    【解决方案1】:

    当您调用rs1.toString() 时,您会得到Object 的默认toString() 实现,它会打印类名和实例哈希(在您的情况下为com.mysql.jdbc.JDBC4ResultSet@81c868)。

    您要做的是从 ResultSet 中提取查询的结果并打印出来。 使用 rs1.getInt(1) 获取您的查询获取的计数。

    参见参考here

    编辑(在问题中编辑后):

    首先,我将第一个查询改为:

    String query = "select count(kelompok),kelompok from email group by kelompok";
    

    因为您按kelompok 分组,所以这是您要计算的列。

    第二,你对结果集的迭代:

    while (rs.next()) {
        dataset.setValue( Integer.parseInt(rs.getString(1)), "Jumlah", rs.getString(2));
    }
    

    我不知道dataset 是什么,但计数返回一个整数,因此尝试读取字符串并将其转换为整数是没有意义的。我建议你使用地图:

    Map<String,Integer> map = new LinkedHashMap<String,Integer>();
    while (rs.next()) {
        map.put (rs.getString(2), rs.getInt(1));
    }
    

    请注意,我选择地图的键是 kelompok(无论这意味着什么),而值是计数。

    第二个查询似乎是多余的,因为您可以从第一个查询的结果中获取它检索到的数据(总数)。

    我们可以将第一个查询结果集的迭代改为:

    Map<String,Integer> map = new LinkedHashMap<String,Integer>();
    int total = 0;
    while (rs.next()) {
        int count =  rs.getInt(1);
        total += count;
        map.put (rs.getString(2), count);
    }
    

    现在您已经获得了将数据输出到文件所需的一切:

    PrintStream out = new PrintStream(new FileOutputStream("OutFile.txt"));
    out.println("E-mail yang diterima adalah sebanyak: "+ total);
    out.println("Dengan detail: ");
    for (String s : map.keySet()) {
        out.println(s + " = " + map.get(s)); // you might want to change the formatting
    }
    out.close();
    

    【讨论】:

    • 抱歉,没有很好地粘贴代码.. 所以,我的 rs1.getInt() 将获得数字 1 成为 rs1.getInt(1),我的 rs.toString 将插入数字 2 成为rs.toString(2)? ps:我已经编辑了代码,我的rs是统计每个类别。我想在我的 txt 文件中显示它,例如:apple 3、orange 2 等
    【解决方案2】:

    首先,在 java 中不能这样工作

            ResultSet rs1 = st.executeQuery(jumlahemail);
            out.println("E-mail yang diterima adalah sebanyak: "+rs1.toString());
            out.println("Dengan detail: ");
            out.println(rs.toString());
    

    你想用这个rs1.toString() 实现什么如果你在任何对象上调用 toString() 它只会给你full-qualified-name-of-the-class@HashCode

    如果您想从ResultSet 中获取数据,您需要先使用next() 像这样遍历ResultSet

    ResultSet rs1 = st.executeQuery(jumlahemail);
    while(rs1.next())
    {          
        out.println("E-mail yang diterima adalah sebanyak: " + rset.getInt(1));
        out.println("Dengan detail: ");
     }
    

    【讨论】:

      【解决方案3】:

      rs.toString() 是什么?不清楚。

      try {
          PrintStream out = new PrintStream(new FileOutputStream("OutFile.txt"));
          String jumlahemail = "select count(*) from email";
          ResultSet rs1 = st.executeQuery(jumlahemail);
          out.println("E-mail yang diterima adalah sebanyak: "+rs1.getInt(1));
          out.println("Dengan detail: ");
          out.println(rs.toString());
          out.close();
      } catch (FileNotFoundException ex) {
          ex.printStackTrace();
      }
      

      试试这个代码。

      【讨论】:

      • 抱歉,没有很好地粘贴代码.. 所以,我的 rs1.getInt() 将获得数字 1 成为 rs1.getInt(1),我的 rs.toString 将插入数字 2 成为rs.toString(2)?
      • ps:我已经编辑了代码,我的rs是统计每个类别。我想在我的 txt 文件中显示它,例如:apple 3、orange 2 等
      最近更新 更多