我的静态变量CClass如果我退出main,会破坏CClass对象吗



我正在尝试创建一个登录应用程序,该应用程序连接到SQL DB以理解和学习Java。我对这个项目的问题是-

  • 我已经在MainLoginPage类中创建了CClass对象,并且我正在main((和SubmitMouseClickedbt((中使用该CClass,但当CClass不在main函数中时,它将被销毁。我之所以将其设置为静态,是因为我只想要一个到SQL DB的连接,并且只想调用该类的方法,因此我只创建了该类的一个对象。如果我的理解有误,请纠正我?

  • 此外,在主LoginPage类中,如何比较用户输入的登录表单中的用户名和SQL DB中的用户名,并检查用户的凭据?我做错了什么?

/主登录页代码/

package test;
import javax.swing.JDialog;

public class MainLoginPage extends javax.swing.JFrame {

public MainLoginPage() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
LoginPage_jPasswordField = new javax.swing.JPasswordField();
LoginPage_jTextField1 = new javax.swing.JTextField();
Submit = new javax.swing.JButton();
Cancel = new javax.swing.JButton();
SignUp = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setText("Username: ");
jLabel2.setText("Password: ");
Submit.setText("Submit");
Submit.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
SubmitMouseClicked(evt);
}
});
Cancel.setText("Cancel");
SignUp.setText("New User? Sign Up Here");
jLabel3.setFont(new java.awt.Font("Verdana", 1, 10)); // NOI18N
jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel3.setText("Login Page");
jLabel3.setBorder(new javax.swing.border.MatteBorder(null));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(28, 28, 28)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(LoginPage_jTextField1))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(LoginPage_jPasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, 183, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(SignUp, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(Submit)
.addGap(18, 18, 18)
.addComponent(Cancel)))))))
.addGroup(layout.createSequentialGroup()
.addGap(169, 169, 169)
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(185, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(LoginPage_jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(29, 29, 29)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(LoginPage_jPasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(42, 42, 42)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(Submit)
.addComponent(Cancel))
.addGap(18, 18, 18)
.addComponent(SignUp)
.addContainerGap(161, Short.MAX_VALUE))
);
pack();
}// </editor-fold>                        
private void SubmitMouseClicked(java.awt.event.MouseEvent evt) {                                    
// TODO add your handling code here:
if(evt.getSource() == Submit){
//Check if the username exists in the database and matches password
//if true then login successful
CClass.createSQLcommandforusernamepass("SELECT * FROM user"); //user -> name of the database
if(LoginPage_jTextField1.getText().equals(CClass.getusername())){
if(LoginPage_jPasswordField.getPassword().toString().equals(CClass.getpass())){
System.out.println("Login Successful");
}
}
}
}                                   

public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(MainLoginPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(MainLoginPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(MainLoginPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(MainLoginPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainLoginPage().setVisible(true);
CClass = ConnectionClass.getInstance();
CClass.createSQLconnection();
}
});
}
/*Getters*/
public String getusername(){
return LoginPage_jTextField1.getText();
}
public String getPassword(){
return String.valueOf(LoginPage_jPasswordField.getPassword());
}
private static ConnectionClass CClass;
// Variables declaration - do not modify                     
private javax.swing.JButton Cancel;
private javax.swing.JPasswordField LoginPage_jPasswordField;
private javax.swing.JTextField LoginPage_jTextField1;
private javax.swing.JButton SignUp;
private javax.swing.JButton Submit;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
// End of variables declaration                   
}
/* CONNECTION CLASS */
package test;
import java.sql.*;
import java.util.HashMap;
public class ConnectionClass {
public ConnectionClass(){
//Default Constructor
}
//Creating the connection to the database
public void createSQLconnection(){
try{
Conn = DriverManager.getConnection(url,db_username,db_password);
if(Conn != null) System.out.println("Connection Established");
} catch(SQLException e){
e.printStackTrace();
}
}
//Creating the SQL Commands for checking username and password
public void createSQLcommandforusernamepass(String command){
if(Conn != null){
System.out.println("Object not null");
try{
Statement stmt = Conn.createStatement();
ResultSet rset = stmt.executeQuery(command);
if(rset.next()){
// Populate the Fields
user = rset.getString("user_name");
pass = rset.getString("password");
userpass.put(user, pass);
}
} catch(SQLException ex){
ex.printStackTrace();
}
} 
}
//Get Instance
public static ConnectionClass getInstance(){
return new ConnectionClass();
}
/*Getter*/
public String getusername(){
return user;
}
/*public boolean checkmapkeyval(){
if((userpass.containsKey(user)) && (userpass.containsValue(pass)))
return true;
else
return false;
}*/
public String getpass(){
return pass;
}
private HashMap<String, String> userpass = new HashMap<>();
private String user;
private String pass;
private static Connection Conn = null;
private String url = "jdbc:mysql://localhost:3306/hrdb";
private String db_username = "root";
private String db_password = "";
}

首先,我不能忽略的是,对于某些函数,您使用了驼色大小写约定,但对于某些函数则没有,比如getusername。关于您的问题:

1-在您的情况下,只有一个到数据库的活动连接是一种很好的做法,但您在getInstance方法中做得不对。您应该在ConnectionClass中定义一个指向实例的静态变量:

public class ConnectionClass {            
public static ConnectionClass instance;
public static ConnectionClass getInstance() {
if(ConnectionClass.instance == null)
ConnectionClass.instance = new ConnectionClass();
return ConnectionClass.instance;
}
private ConnectionClass() {
//Default Constructor should be private to prevent any unwanted usage
}   
}

2-您应该在数据库查询中使用WHEN,并在其中传递用户名和密码。请注意,为了防止SQL注入,您需要使用准备好的语句。您的查询应该类似于SELECT * FROM users WHERE username = ? AND password = ?;。问号应绑定到用户输入的实际值。

最新更新