从mysql行获取数据并通过Java中的ResultSet单独显示它们

时间:2014-04-17 14:05:06

标签: java mysql jdbc

我有一个mysql表user,它由id, name, password and email列组成。

有没有办法创建某种查询或java代码,在我的消息对话框窗口中打印所有用户名。

try{
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydb","root","");          
      String sql = "select * from user;";
      Statement st = con.createStatement();
      ResultSet rs = st.executeQuery(sql);
      if (rs.next()) {
        val1 = rs.getString(2);
        val2 = rs.getString(3);
      }
      value = val1 + " " + val2;
      JOptionPane.showMessageDialog(null,value);
    }catch(SQLException e){
      JOptionPane.showMessageDialog(null, e);
    }
}

这只会打印表格中第一个用户的姓名和姓氏:(

我想把它们打印在另一张下面!

如果我设置了rs.getString(5); - 它给我一个错误:列索引超出范围。

2 个答案:

答案 0 :(得分:1)

您只从结果集中获取第一行。听起来你想要一个循环,并处理结果集中的每一行。

  while (rs.next()) {

  }

<强>更新

问:它现在只给我最后一个用户。可能是因为它覆盖了val1和val2变量。我想不知怎的,这也应该进入循环..

A:是的,它应该进入循环内部。但是我要填充一个集合,而不是连接一个字符串。


作为性能和维护说明,您可以通过在SQL语句中进行串联来避免Java中字符串连接的混乱。我不会使用SELECT *并依赖结果集中两个特定列的位置。

我使用这样的SQL语句:

  SELECT CONCAT(u.first_name,' ',u.last_name) AS user_name FROM users

如果我没有填充集合,并且我需要连接一个honkous字符串,我会使用StringBuffer,例如。

  val = new StringBuffer(4096));
  while (rs.next()) {
     val.append(rs.getString("user_name"));
  }
  value = val.toString;

答案 1 :(得分:1)

我建议你为这种代码避免使用JOptionPane。最好使用一些Frame(Swing)并将所有用户显示在一个单独的窗口中。

你的代码的问题是变量值是循环之外的lyiong(循环时必须是btw,正如spencer所说)。

try{
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydb","root","");   
  String sql = "select * from user;";
  Statement st = con.createStatement();
  ResultSet rs = st.executeQuery(sql);
  while (rs.next()) {
    val = rs.getString(2) + " " + rs.getString(3);
    value += val + " ";
  }
  JOptionPane.showMessageDialog(null,value);
}catch(SQLException e){
  JOptionPane.showMessageDialog(null, e);
}

}

尽量避免使用这种类型的代码,使用ArrayList并在数组中保存所有用户凭据。然后在任何地方轻松标记它。