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

Posted

技术标签:

【中文标题】如何从另一个类访问mysql数据库中的变量?【英文标题】:How to access a variable in mysql database from another class? 【发布时间】:2020-08-09 17:45:30 【问题描述】:

我正在尝试从另一个类中访问一个变量。

在下面的示例中,我有 2 个文件,一个名为 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
     

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

【问题讨论】:

关注Java naming conventions。 @ArvindKumarAvinash 嗨,有什么办法可以解决这个问题吗? 【参考方案1】:

你的代码有很多问题:

    您应该始终关注Java naming conventions,例如你应该将你的班级命名为Login 而不是login。同样,您的方法的名称应该是loginButtonActionPerformed 而不是LoginButtonActionPerformed

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

    您应该避免使用变量public。您应该将sessionId 保留为privateprotected as per the requirement 并为其创建public 访问器和修改器,如下所示:

    private String sessionId;
    
    public setSessionId(String sessionId) 
        this.sessionId = sessionId;
    
    
    public String getSessionId() 
        return sessionId;
    
    

    您正在从方法LoginButtonActionPerformed 返回sessionId 的值,因此您需要在您的方法RequestButtonActionPerformed 中调用此方法,如下所示:

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

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

    更好的方法是将LoginButtonActionPerformed 声明为public void,然后您可以这样做:

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

【讨论】:

我刚刚将 LoginButton 函数声明为 public,在另一个 java 类文件中我做了“userId = testing.LoginButtonActionPerformed(evt);”正如你所说,但有一个错误,建议是创建局部变量 evt,或创建参数 evt 并创建一个字段 evt 所有选项仍然为我返回 null 我也无法删除登录功能中的操作 evt,因为我正在使用此“LoginButton.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event. ActionEvent evt) LoginButtonActionPerformed(evt); );" 签名RequestButtonActionPerformed(java.awt.event.ActionEvent evt)已经有一个名称为evt的参数。所以,你只是将这个evt 传递给LoginButtonActionPerformed,这应该不是问题。您可以使用答案中的所有建议来编辑您的问题吗?这将花费您 5 分钟,但可以为您节省大量精力来处理问题。我会等你的更新。 我可以清楚地看到问题所在。您正在从没有java.awt.event.ActionEvent evtDisplayRecords 呼叫LoginButtonActionPerformed。这就是为什么我要求您将LoginButtonActionPerformed 声明为void (答案中的检查点#5)。之后,在DisplayRecords 方法中,您可以执行login testing = new login(); String userId = testing.getSessionId(); 我明白先生,但是在尝试了您的解决方案之后它仍然是空的,让我给你看一下我写的东西

以上是关于如何从另一个类访问mysql数据库中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

访问从另一个类调用的函数中的变量

如何从另一个类(java)访问主类的变量?

如何从另一个 UIView 类访问 UIControl 的值

如何从另一个类访问函数?

如何通过 GetComponent 从另一个游戏对象中的另一个脚本访问变量?

如何从另一个类访问 MFC 中的对话框项?