Я новичок в java-программе. Я создал java-программу с интерфейсом входа в систему, используя eclipse и MYSQL. как только я вхожу в систему, повторяя его успешно, 2 или 3 раза. и его открытие в 2 раза больше основного интерфейса. вот мой код. глядя на решение.
JButton btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
String query = "select * from xyzlibrary.user_account";
Statement st = con.createStatement();
ResultSet rs=st.executeQuery(query);
while (rs.next()) {
String username= rs.getString(1);
String password= rs.getString(2);
if (tfusername.getText().equals(username) && tfpasswordField.getText().equals(password)) {
JOptionPane.showMessageDialog(null, "Login successfull!");
Admin ad = new Admin();
ad.setVisible(true);
dispose();
}else
JOptionPane.showMessageDialog(null, "Incorrect User ID or Password!");
}
} catch (Exception e) {
// TODO: handle exception
}
}
});
btnLogin.setBounds(125, 187, 89, 23);
contentPane.add(btnLogin);
Добавьте предложение where
в ваш query
потому что вы получите все строки из своей таблицы пользователя. Тогда из - за в while
циклы вы получаете 2,3 или больше сообщений и окна, в зависимости от количества строк.
Сообщение "login successful" будет напечатано столько раз, сколько результатов в вашем запросе. Поэтому, если у вас есть 2 имени пользователя, он будет печататься 2 раза.
Почему бы не переместить печать из цикла while? Таким образом, он будет печататься только один раз независимо от того, сколько результатов вы получите.
Еще одна вещь, которую вы можете сделать, это добавить оператор возврата после распечатки принятого входа. Это решит вашу непосредственную проблему. Но в долгосрочной перспективе я предлагаю вам добавить предложение SQL WHERE в оператор SQL Select
Гораздо проще выбрать только соответствующие записи вашей таблицы, путем фильтрации полей имени пользователя и пароля на уровне запросов.
Также используйте PreparedStatement
который будет следить за тем, чтобы избежать ваших значений и предотвратить SQL-инъекцию.
В приведенном ниже примере предполагается, что соответствующие столбцы в вашей таблице называются username
и password
, просто измените их на фактические имена ваших столбцов.
// just change the column names to fit your table columns
String query = "SELECT username from xyzlibrary.user_account WHERE username = ? AND password = ?";
// create a PreparedStatement which will escape values correctly
PreparedStatement st = con.prepareStatement(query);
// replace values
st.setString(1,tfusername.getText());
st.setString(2,tfpasswordField.getText());
ResultSet rs=st.executeQuery();
// if the result is not empty, the login is a success
if(rs.next()){
JOptionPane.showMessageDialog(null, "Login successfull!");
Admin ad = new Admin();
ad.setVisible(true);
dispose();
}
else{
JOptionPane.showMessageDialog(null, "Incorrect User ID or Password!");
}