我想检查username
表中是否已存在database
。
Java代码:
if (e.getSource() == jButton2)
{
U = jTextField1.getText();
if (jTextField1.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(this, "Please Write Username !");
}
else if (jPasswordField1.getText().equals(""))
{
JOptionPane.showMessageDialog(this, "Please Write Password !");
}
else
{
try {
String Driver = "com.mysql.jdbc.Driver";
String URL = "jdbc:mysql://localhost:3306/LoginForm";
Class.forName(Driver);
Connection Conn = DriverManager.getConnection(URL, "root", "12345");
Statement S = Conn.createStatement();
ResultSet RS = S.executeQuery(
"SELECT * FROM login where username ='" + U +
"' and Password ='" + jPasswordField1.getText() + "'");
while (RS.next()) {
String Username = RS.getString("Username");
String Password = RS.getString("Password");
String Admin = RS.getString("Admin");
if (Username.equals(U) & Password.equals(jPasswordField1.getText()) &
Admin.equals("0"))
{
JOptionPane.showMessageDialog(this, "Logged In Successfully !");
this.dispose();
NormalUsers NU = new NormalUsers();
break;
}
else if (Username.equals(U) &
Password.equals(jPasswordField1.getText()) & Admin.equals("1"))
{
JOptionPane.showMessageDialog(this,
"Logged In Successfully , Opening Administration Panel !");
this.dispose();
AdminPanel AP = new AdminPanel();
break;
}
else
{
JOptionPane.showMessageDialog(this, "Invalid Username Or Password!");
}
}
}
catch (SQLException | ClassNotFoundException ex)
{
}
}
}
问题是:
database
中没有行,则表示没有错误消息:Invalid Username or Password
。 SQL
查询时:SELECT * From Login
我看到该行存在,但由于我对password
进行了过滤,因此无法进入while loop
我应该如何使用java来检查MySQL表中是否存在用户名?
答案 0 :(得分:6)
对于此查询类型,您不需要遍历ResultSet。
您正在尝试找到一条确定的记录。你不会有两个具有相同用户名/密码的记录(我假设登录表的主键是用户名),所以只需if(rs.next())
即可。如果存在,请验证以确定它是否为管理员。
此外,在查询中,您已经暗示该记录必须具有指定的用户名和密码,一旦返回结果集,则无需对其进行测试。
只测试用户类型,如果是管理员,则显示相应的消息,否则,执行正确的操作。
如果未满足rs.next()
,则该用户不存在,因此在else
块中,您可以显示有关未找到或无效的用户的错误消息。
答案 1 :(得分:5)
您需要处理的是MySQL查询。我认为带有WHERE
子句的查询就是你要找的。 p>
此外,您可能希望将该代码放在单独的类中,以防止烹饪一些spaghetti code。
以下链接是与php语言相关的答案,但您需要查看的是MYSQL query
和逻辑:Check If Username Exists
尝试这样的事情:
public String login(String uname, String password) throws Exception{
String status=null;
ConnectionHandler handler=new ConnectionHandler(); //class for connection
Connection con=handler.createConnection();
Statement stmt=con.createStatement();
String query="select * from loginTable where username=" +
"\""+uname+"\""+";"; //get username
ResultSet rs=stmt.executeQuery(query);
String checkUser=rs.getString(1);
String checkPass=rs.getString(2);
if(checkUser.equals(uname) && checkPass.equals(password)){
status="True";
}
else{
status="False";
}
con.close();
return status;
}
使用此status
字符串,我确定用户名是否有效。让SQL做繁重的工作(就像它设计的那样),而不是用java自己编写。
答案 2 :(得分:2)
你可以SELECT COUNT(*) AS total FROM login where username
...
然后是resultSet.getInt("total")
。如果用户已存在的总数大于0。
我也会使用PreparedStatement,因为它不太容易受到sql注入攻击。
看一下这个https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java。
sql count的例子......
ResultSet RS = S.executeQuery("SELECT COUNT(*) AS total FROM login where username ='" + U + "' and Password ='" + jPasswordField1.getText() + "'");
while (RS.next()) {
if( RS.getInt("total") > 0 ) {
// user already exists
} else {
// user does not exist
}
}
答案 3 :(得分:2)
假设只返回一行,您可以用if语句替换while循环。执行查询后,您也无需检查用户名和密码,因为这是由where子句处理的。因此,您的查询可以修改为:
PreparedStatement prest = Conn.prepareStatement("SELECT Admin FROM login WHERE username = ? and Password = ?");
prest.setString(1, U);
prest.setString(2, jPasswordField1.getText());
然后使用if语句处理它:
if (rs.next()) {
//Process user level (Normal or admin)
} else {
//Incorrect login details
}
答案 4 :(得分:0)
我是Java的新手,但我认为你应该检查一下jPasswordField
,如果它是JTextBox
没有问题但是如果是JPasswordField
那么getText()
会返回byte[]
非字符串,您需要先将byte[]
转换为string
。