[英]Java JDBC swing login form error
我目前正在從事一個簡單的JDBC項目,並且停留在登錄表單上
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost/company","root","redhat");
stmt=con.createStatement();
String nm=jTextField1.getText();
char[] pass=jPasswordField1.getPassword();
String pw=Arrays.toString(pass);
String sql="select * from login where uname='"+nm+"' and pass='"+pw+"'";
rs=stmt.executeQuery(sql);
if(rs.next())
{
new MainPage().setVisible(true);
this.setVisible(false);
}
else
{
JOptionPane.showMessageDialog(this, "Wrong User name or password");
jTextField1.setText("");
jPasswordField1.setText("");
}
}
catch(Exception e)
{
System.out.println(e);
}
} `
單擊此按鈕時,將顯示一個我創建的新頁面,但它顯示“錯誤的用戶名或密碼”消息對話框。 我有什么錯 我的數據庫在mysql中。
錯誤1: Arrays.toString(char[])
將返回一個數組表示形式,例如,如果jPasswordField1
中的password
為password
,則結果為以下字符串: [p, a, s, s, w, o, r, d]
修復1:使用new String(char[])
代替。
錯誤2:使用字符串串聯構建SQL語句。 這將使您的代碼容易受到SQL Injection攻擊,黑客可以在其中竊取您的數據並刪除您的表 。
修復2:使用PreparedStatement
。
錯誤3:未釋放資源。 這將導致內存泄漏。
修復3:使用try-with-resources 。
結果:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
boolean loginOk;
Class.forName("com.mysql.jdbc.Driver");
try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost/company","root","redhat")) {
String sql = "select * from login where uname=? and pass=?";
try (PreparedStatement stmt = con.prepareStatement(sql)) {
stmt.setString(1, jTextField1.getText());
stmt.setString(2, new String(jPasswordField1.getPassword()));
try (ResultSet rs = stmt.executeQuery(sql)) {
loginOk = rs.next();
}
}
}
if (loginOk) {
new MainPage().setVisible(true);
this.setVisible(false);
} else {
JOptionPane.showMessageDialog(this, "Wrong User name or password");
jTextField1.setText("");
jPasswordField1.setText("");
}
} catch(Exception e) {
System.out.println(e);
}
}
這似乎表明您的查詢返回了空結果集。 如果直接針對數據庫運行它會怎樣?
另外, Arrays.toString(...)
將為您提供數組的String表示形式。 您可能需要String中數組的內容-有所不同。 嘗試改用new String(pass)
。
我認為“錯誤的用戶名或密碼”表示rs為空或rs'size為0。您應該檢查名稱和密碼。
Arrays.ToString返回指定數組內容的字符串表示形式。 字符串表示形式包含數組元素的列表。
在你的情況下
String pw = Arrays.toString(pass);
您應該用來獲取String形式的密碼。
String pw = String.copyValueOf(pass);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.