我有一个Manager类,可以将数据保存在SQL表中,还可以从SQL表中获取结果并测试这些数据。当我运行程序时,将显示一个获取ID和密码的框架,如果它们正确,则另一个框架将但是我不知道为什么它只是测试SQL表的最后一行?我的意思是如果我用除最后一行以外的其他ID和密码设置那些文本字段,它将显示数据错误(我之前为错误的数据设置了它)
经理班:
public static boolean Test(String userName, String password) {
boolean bool = false;
Statement stmt = null;
try {
stmt = conn.createStatement();
ResultSet rst = null;
rst = stmt.executeQuery("SELECT yahooId , password FROM clienttable");
while (rst.next()) {
if (rst.getString(1).equalsIgnoreCase(userName) && rst.getString(2).equalsIgnoreCase(password)) {
bool = true;
} else {
bool = false;
}
}
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
}
return bool;
}
我的按钮在获取ID和密码并对其进行测试的框架中执行操作:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
submit();
} catch (ConnectException ex) {
JOptionPane.showMessageDialog(this, "You coudn't connect to the server successfully,try it again", "Sign_In Problem", JOptionPane.OK_OPTION);
}
clear();
}
private void submit() throws ConnectException {
String id = idField.getText();
char[] pass1 = passField.getPassword();
String pass = new String(pass1);
if (id.equals("") || pass.equals("")) {
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(this, "You should enter an ID and password", "Sign_In Problem", JOptionPane.OK_OPTION);
return;
} else {
boolean b = Manager.Test(id, pass);
client.setCurrentName(id);
if (b == true) {
this.setVisible(false);
ListFrame frame = new ListFrame(client);
frame.setVisible(true);
} else {
JOptionPane.showMessageDialog(this, "You have entered wrong datas,try it again", "Sign_In Problem", JOptionPane.OK_OPTION);
return;
}
}
}
编辑:
我已经编辑了我的经理班级(测试方法),但它仍然像过去一样工作!
public static boolean Test(String userName, String password) {
boolean bool = false;
PreparedStatement stmt = null;
ResultSet resultSet = null;
try {
stmt = conn.prepareStatement("SELECT id FROM clienttable WHERE yahooId = ? AND password = ?");
stmt.setString(1, userName);
stmt.setString(2, password);
resultSet = stmt.executeQuery();
bool = resultSet.next();
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
resultSet.close();
stmt.close();
conn.close();
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
}
}
return bool;
}
因为您要将 整个 数据库表拖到Java内存中,并在while循环中测试 每一
行。如果找到匹配项,则不会中断循环,这样它将继续覆盖布尔结果,直到最后一行为止。
也就是说,您真的不想在Java中进行比较。只需使用SQL
WHERE
子句即可
。这 要 高效 得多
,实际上是数据库应该完成的任务。不要试图用Java接管数据库的工作,那样只会效率低下。
public boolean exists(String username, String password) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
boolean exists = false;
try {
connection = database.getConnection();
preparedStatement = connection.prepareStatement("SELECT id FROM client WHERE username = ? AND password = ?");
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();
exists = resultSet.next();
} finally {
close(resultSet);
close(preparedStatement);
close(connection);
}
return exists;
}
您会看到我做了一些增强:
要了解有关以适当方式使用JDBC的更多信息,您会发现本基础教程很有用。
问题内容: 例如,我有一个这样的表: 当我需要所有记录时,我会这样做,并获得3个结果: 但我想获得第4行,以表示数量(50)和某物(6)。sql查询中是否可能,或者我必须循环执行查询才能在查询执行后获得总计?我想在查询中做到这一点。 问题答案: 这是工作查询。它将在结果的最后添加第四行
问题内容: 我试图找出表中是否存在行。使用MySQL,最好执行如下查询: 并检查总数是否为非零或执行以下查询更好: 并检查是否返回任何行? 在两个查询中,WHERE子句均使用索引。 问题答案: 您也可以尝试: 根据文档,您可以执行任何操作。 传统上,EXISTS子查询以SELECT 开头,但可以以SELECT 5或SELECT column1或任何其他形式开头。 MySQL会忽略此类子查询中的SE
问题内容: 如何在MySQL表中最后一行? 我正在读取数据,我需要从上一行中检索列值。 桌子上有一个。 问题答案: 是的,那里有一个auto_increment 如果您想要表中 所有行 的最后 一行 ,那么最后就是正确答案的时候了!有点儿:
问题内容: 这个SQL Server片段的PLSQL(Oracle)等效项是什么? 在C#中,您可以调用myCommand.ExecuteScalar()来检索新行的ID。 如何在Oracle中插入新行,并让JDBC获得新ID的副本? 编辑: BalusC提供了一个很好的起点。由于某种原因,JDBC不喜欢命名参数绑定。这给出了“错误设置或注册的参数” SQLException。为什么会这样呢? 问
问题内容: 我有一个带有索引(自动递增)和整数值的表。该表长百万行。 如何搜索某个数字是否最有效地出现在表的最后n行中? 问题答案: 从@chaos给出的答案开始,但进行了一些修改: 如果使用,则应始终使用。对于RDBMS表,没有保证的隐式顺序。 通常, 您可能 会 按主键的顺序获得行,但是您不能依靠它,也不是可移植的。 如果按降序排列,则无需事先知道表中的行数。 您必须为派生表指定一个 相关名称
对于这个问题,我找到了一些不同的答案,但似乎无法使查询正常工作。 这是我的表,其中包含user、weekNo、salesTotalYTD列。 我目前正在把这些拿出来,按周分组,就像这样: 我试图做但无法完成的是: 这是我为第一次通过工作的查询,但之后的每一次通过都是错误的: 更新 更新代码由蒂姆提供,但返回错误: