无法在 javaFX 中显示数据库中选定行的数据

Can't display selected row's data from database in javaFX


我正在尝试在 JavaFX 和 Sqlite 中创建用户登录和注册应用程序。

我成功地将数据插入数据库 Window 并且 Select 登录中数据库中的数据 window。

但是我需要在新的 window 中显示用户的所有数据(在数据库中记录)。我为它输入了一些代码,但每次登录后它只显示用户 window.

数据库中的最后数据

login code:

@FXML
public Label errMesage;

@FXML
public TextField userNameTF;

@FXML
public TextField passwordTF;

@FXML
public Button loginBtn;

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

}
public void handleSecoundaryRegestrationLink(ActionEvent event) throws IOException{

    Parent switchAlterRegestrationPage = FXMLLoader.load(getClass().getResource("/gui/gui1.fxml"));
    Scene sceneAlterRegestrationPage = new Scene(switchAlterRegestrationPage);

    Stage stageAlterRegestrationPage = (Stage)((Node)event.getSource()).getScene().getWindow();
    stageAlterRegestrationPage.hide();
    stageAlterRegestrationPage.setScene(sceneAlterRegestrationPage);
    stageAlterRegestrationPage.show();

}


public void handleLoginBtn(ActionEvent event) throws IOException{
    Parent login = FXMLLoader.load(getClass().getResource("/gui/user.fxml"));
    Scene sceneLogin = new Scene(login);
    Stage stageLogin = (Stage)((Node)event.getSource()).getScene().getWindow();
    if(isValidLoginCOndition()){
        stageLogin.hide();
        stageLogin.setScene(sceneLogin);
        stageLogin.show();


    }
    else{
        errMesage.setText("UserName or Password not Matched!");
    }

}


public boolean isValidLoginCOndition() {

    boolean let_in = false;
    System.out.println("SELECT * FROM user WHERE usrName = "+"'" + userNameTF.getText() +"'"
            + "AND PASSWORD "+ "'" + passwordTF.getText()+"'");
    Connection c = null;
    Statement stmt = null;
    try {
        c = DriverManager.getConnection("jdbc:sqlite:regestration.db");
        c.setAutoCommit(false);

        System.out.println("Opened database successfully");
        stmt = c.createStatement();

        ResultSet rs = stmt.executeQuery( "SELECT * FROM user WHERE USERNAME= " + "'" + userNameTF.getText() + "'" 
        + " AND PASSWORD= " + "'" + passwordTF.getText() + "'");

        while ( rs.next() ) {
             if (rs.getString("USERNAME") != null && rs.getString("PASSWORD") != null) { 
                 String  username = rs.getString("USERNAME");
                 System.out.println( "USERNAME = " + username );
                 String password = rs.getString("PASSWORD");
                 System.out.println("PASSWORD = " + password);
                 let_in = true;
             }  
        }
        rs.close();
        stmt.close();
        c.close();
        } catch ( Exception e ) {
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );
            System.exit(0);
        }
        System.out.println("Operation done successfully");
        return let_in;
}
}

user Form code:

@FXML
public Label loginFullName;

@FXML
public Label emailLB;

@FXML
public Label loginFullName2;

@FXML
public AnchorPane usrAP;



@Override
public void initialize(URL location, ResourceBundle resources) {

}


public void handleShowDetails(){    




    Connection c = null;
    Statement stmt = null;

    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:regestration.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      stmt = c.createStatement();

      ResultSet rs = stmt.executeQuery( "SELECT * FROM user");

      while ( rs.next()) {
         String fullname = rs.getString("FULLNAME");
         String  email = rs.getString("EMAIL");

         loginFullName.setText(fullname);
         emailLB.setText(email);
         loginFullName2.setText(fullname);

         System.out.println( "FULLNAME = " + fullname );
         System.out.println( "EMAIL = " + email );
         System.out.println();

      }
      rs.close();
      stmt.close();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
     System.exit(0);
    }

}








public void handleLogOut(ActionEvent event) throws IOException{
    Parent logout = FXMLLoader.load(getClass().getResource("/gui/login.fxml"));
    Scene sceneLogOut = new Scene(logout);

    Stage stageLogOut = (Stage) ((Node)event.getSource()).getScene().getWindow();
    stageLogOut.hide();
    stageLogOut.setScene(sceneLogOut);
    stageLogOut.show();
}

}

如果我理解你想要的行为,你想通过调用 handleShowDetails 函数以额外的形式显示用户详细信息。 如果是这样,sql 调用

Select * from user

将从数据库中获取所有用户。然后你遍历数据并设置一个标签登录全名,它总是只显示 while 循环的最后一项。

因此,如果您只想显示当前登录用户的数据,则必须将这些额外参数传递给您的 sql 调用,例如

Select * from user where usrName=...

就像您在登录表单中所做的那样。

为了优化,您最好将登录过程中的用户数据存储在用户对象中,以避免在会话期间多次调用您可以使用的数据库。