You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NetBeans中通过MySQL实现JFrame间用户名传递问题排查

问题

我想获取登录用的用户名,基于MySQL创建查询来展示该用户的所有数据(比如在Dashboard中显示登录用户的名称)。但操作后Dashboard端的getUsername()返回null,登录端却能正常获取;试过用数组存储字符串也变成null。附上Login、Dashboard代码及输出结果,请问问题出在哪?


相关代码及输出

Login代码

if(rs.next())
{
    StudentHomeDashboard studentHomeDashboard = new StudentHomeDashboard();

    loginDetails = rs.getString("RegNO");
    
    setUsername(loginDetails);
    System.out.println("Username : " + getUsername());

    //Correct details
    JOptionPane.showMessageDialog(null, "Successfully Logged In!");
    
    //close login form
    this.setVisible(false);
    this.dispose();
    
    studentHomeDashBoard.show();
}
else
{
   JOptionPane.showMessageDialog(null, "INVALID DETAILS!"); 
   
   //clear the form automatically
    usernameField.setText("");
    passwordField.setText("");
}

Dashboard代码

//GET NAME, YEAR, SCHOOL, PROGRAMME
try 
{
    StudentLogin login = new StudentLogin();

    //Fetch Values for the specific user
    String studentDetails = 
    "SELECT * FROM student WHERE RegNO = '"+login.getText()+"'";
    System.out.println("Login is: " + login.getText());

    ps = ConnectionDatabase.DbConnection().prepareStatement(studentDetails);
    
    rs = ps.executeQuery();
            
    while(rs.next())
    {     
        String fullName = rs.getString("FullName");
        String regNO = rs.getString("RegNO");
        
        studentNameLbl.setText(fullName);
        regNumberLbl.setText(regNO);
    }
}
catch (Exception e)
{
    
}

输出结果

run:
Login is: 
Connection Established!
Connection Established!
Login is: 
Connection Established!
Username : AP003/0007/12
BUILD SUCCESSFUL (total time: 12 seconds)

问题分析与解决

核心问题

Dashboard里StudentLogin login = new StudentLogin();这行代码新建了一个全新的StudentLogin实例,和之前登录时的实例完全无关,自然获取不到之前设置的用户名,所以login.getText()返回空字符串。

另外还存在两个隐性问题:

  1. 直接拼接SQL语句,存在严重的SQL注入风险;
  2. catch块空实现,异常被吞掉,无法排查潜在问题;
  3. 数据库资源未正确关闭,可能导致连接泄漏。

修正方案

1. 传递登录用户名到Dashboard

修改Login代码,通过构造方法把登录成功的用户名传给Dashboard:

if(rs.next())
{
    loginDetails = rs.getString("RegNO");
    setUsername(loginDetails);
    System.out.println("Username : " + getUsername());

    JOptionPane.showMessageDialog(null, "Successfully Logged In!");
    
    this.setVisible(false);
    this.dispose();
    
    // 把用户名通过构造方法传入Dashboard
    StudentHomeDashboard studentHomeDashboard = new StudentHomeDashboard(loginDetails);
    studentHomeDashboard.show();
}

2. 修改Dashboard接收参数并安全查询

private String loggedInRegNO;

// 新增带参数的构造方法
public StudentHomeDashboard(String regNO) {
    initComponents(); // 保留原UI初始化方法
    this.loggedInRegNO = regNO;
    loadStudentDetails();
}

// 单独提取加载用户信息的方法
private void loadStudentDetails() {
    // 使用try-with-resources自动关闭资源
    try (Connection conn = ConnectionDatabase.DbConnection();
         PreparedStatement ps = conn.prepareStatement("SELECT * FROM student WHERE RegNO = ?")) {
        
        // 参数绑定避免SQL注入
        ps.setString(1, loggedInRegNO);
        System.out.println("Login is: " + loggedInRegNO);

        try (ResultSet rs = ps.executeQuery()) {
            if(rs.next())
            {     
                String fullName = rs.getString("FullName");
                String regNO = rs.getString("RegNO");
                
                studentNameLbl.setText(fullName);
                regNumberLbl.setText(regNO);
            } else {
                JOptionPane.showMessageDialog(null, "未找到该用户信息");
            }
        }
    } catch (Exception e) {
        // 打印异常便于调试
        e.printStackTrace();
        JOptionPane.showMessageDialog(null, "加载用户信息失败:" + e.getMessage());
    }
}

内容的提问来源于stack exchange,提问作者Shem Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:30:58