有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从另一个类访问mysql数据库中的变量?

我试图从一个类访问另一个类中的变量

在下面的示例中,我有两个文件,一个名为login.javausermainpage.java
我想从usermainpage类文件访问login.java中名为sessionId的变量

我尝试了几种方法,但根本不起作用,在登录类文件中,我将sessionId声明为public string,并在文件中定义为等于从数据库中检索的数据。(如果你看到代码,我也在做数据库连接)。
我想,通过在函数末尾返回sessionId,我现在可以从所有其他java文件中访问这个变量,但没有,在我的usermainpage.java文件中,我尝试打印出sessionId,但它什么也没有显示。让我知道一个解决方案,谢谢

// login.java file
public class login extends javax.swing.JFrame {
    public String sessionId;
    Connection con;
    PreparedStatement pst;
    ResultSet rs;

    private String LoginButtonActionPerformed(java.awt.event.ActionEvent evt) {
        try{
            String query = "SELECT * FROM `accounts` WHERE username=? and password=?";
            con = DriverManager.getConnection("jdbc:mysql://localhost/restock", "root", "password");
            pst = con.prepareStatement(query);
            pst.setString(1, txtUsername.getText());
            pst.setString(2, txtPassword.getText());
            rs = pst.executeQuery();
            if(rs.next()){
                String userType = rs.getString("usertype");
                sessionId = rs.getString("id");
                System.out.print("##########" + sessionId + "##########"); //this prints out the id I want
                if(userType.equals("Admin")){
                    JOptionPane.showMessageDialog(this, "Login is successful as admin");
                    mainpage admin = new mainpage();
                    admin.setVisible(true);
                    dispose();
                } else{
                    JOptionPane.showMessageDialog(this, "Login is successful as user");
                    usermainpage user = new usermainpage();
                    user.setVisible(true);
                    dispose();
                }
            }
            else{
                JOptionPane.showMessageDialog(this, "Incorrect username or password");
                txtUsername.setText("");
                txtPassword.setText("");
            }
            
        } catch(HeadlessException | SQLException ex){
            JOptionPane.showMessageDialog(this, ex.getMessage());
        }
        
        return sessionId;
        
    }

}

//usermainpage.java file
public class usermainpage extends javax.swing.JFrame {

    private void RequestButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
          String type = txttype.getSelectedItem().toString();
          String name = txtname.getText();
          String quantity = txtquantity.getText();
          String status = "Pending";
          String userId;
        
          //Create new class object from login.java
          login testing = new login();
          userId = testing.sessionId;
          System.out.print("########## " + userId + "########## "); //this prints out null value
     }
}

编辑:以下是我根据建议遇到的一些问题

enter image description here

enter image description here

enter image description here

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    你的代码有很多问题:

    1. 你应该始终遵循Java naming conventions例如,你应该将你的类命名为Login,而不是login。同样,方法的名称应该是loginButtonActionPerformed,而不是LoginButtonActionPerformed

    2. 我看不到参数java.awt.event.ActionEvent evt在您的方法LoginButtonActionPerformed中有任何用途。我会从它的定义和调用中删除它

    3. 你应该避免使用变量public。您应该将sessionId保留为privateprotected{a2},并为其创建public访问器和变异器,如下所示:

      private String sessionId;
      
      public setSessionId(String sessionId) {
          this.sessionId = sessionId;
      }
      
      public String getSessionId() {
          return sessionId;
      }
      
    4. 您正在从方法LoginButtonActionPerformed返回sessionId的值,因此需要在方法RequestButtonActionPerformed内调用此方法,如下所示:

      login testing = new login();
      userId = testing.LoginButtonActionPerformed(evt);
      

      但是,为此,您需要将方法LoginButtonActionPerformed声明为public

    5. 更好的方法是将LoginButtonActionPerformed声明为public void,然后可以执行以下操作:

      login testing = new login();
      testing.LoginButtonActionPerformed(evt);
      userId = testing.getSessionId();