ActionListener A_confrim=new ActionListener(){
public void actionPerformed(ActionEvent e){
setVisible(false);
String id1=id.getText();
String code1=code.getText();
mysql land_sql=new mysql("select * from USER");
ResultSet rs=land_sql.getresul();
try
{
while(rs.next())
{
System.out.println(rs.getString("ID")+rs.getString("CODE"));
if(id1.equals(rs.getString("ID"))&&
code1.equals(rs.getString("CODE")))
{
new mainFrame();
break;
}
else
{
JOptionPane.showMessageDialog(null,"用户名或密码错误,请重新输入",
"通讯录管理系统",JOptionPane.ERROR_MESSAGE);
id.setText(null);
code.setText(null);
setVisible(true);
break;
}
}
}
catch(SQLException se){
System.out.println(se);
}
}
};
无论怎样,你这个是只有数据库第一条记录的用户才可以登录吧?
仔细看看自己的逻辑呗,第一次循环就是if...else二选一的结果了。
虽然有些安全性问题等,但估计你不用考虑,为什么不用:
“SELECT * FROM user WHERE id=“' + id1 + ”' AND code='“ + code1 + ”'”
然后判断 rs.hasNext() ? 这样来判断用户呢?追问
使用rs.next()逐个选取结果集来与输入的比对不行么?
追答那你要有100万个用户,一个用户登录,平均要判断50万条记录吗?
追问还是没转过来,找你这样说,这段代码知识耗时,而不应该是错误?那错误在哪呢?
追答因为你的If,else写法,如果第一条记录不匹配,并不会查看第二条记录,直接就进入“else”里面显示用户名密码错误退出了。
上面不是说了吗
String id1=id.getText();
String code1=code.getText();
mysql land_sql=new mysql("SELECT * FROM user WHERE id='" + id1 + "' AND code='" + code1 + "'");
ResultSet rs=land_sql.getresul();
try
{
System.out.println(rs.getString("ID")+rs.getString("CODE"));
if(rs.next()){
new mainFrame();
}
else{
id.setText("");
code.setText("");
setVisible(true);
还是不对,抛出异常
异常是什么?
追问java.sql.SQLException: Before start of result set
追答ResultSet的用法不对。
ResultSet在实例生成时,指针是指向“第一条记录之前”的位置。
也就是说:必须至少调用一次 rs.next() 方法才可以访问到记录(如果有的话)。
把你的输出信息放到if里面,所以是:
if (rs.next()) {
System.out.println(rs.getString("ID")+rs.getString("CODE"));
// 用户名和密码匹配成功的逻辑
} else {
System.out.println("No matched user and password combination");
// 显示错误的逻辑
}
记得用try。。。catch,还有记得finally的时候调用 rs.close();
在while中如果用户名和密码匹配,则将定义的标示设置为true,即isRight=true。
在while外面判断isRight,如果isRight=true,则表名用户名和密码是正确的。
还有一个问的就是,code这个密码组件你用的是JTextField 还是JPasswordField呢?
建议这样的写法:
id.setText(null);
code.setText(null);
写成这样的:
id.setText(“”);
code.setText(“”);追问
java.sql.SQLException: Before start of result set
追答引用 leemax 的话
“因为你的If,else写法,如果第一条记录不匹配,并不会查看第二条记录,直接就进入“else”里面显示用户名密码错误退出了。”
qincidong的做法可以参考的啊!