我有一个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); - 它给我一个错误:列索引超出范围。
答案 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并在数组中保存所有用户凭据。然后在任何地方轻松标记它。