使用Derby数据库填充TableView

时间:2019-10-13 06:42:16

标签: javafx derby

这是我第一次使用Derby数据库,无法在表视图中添加信息。

public class AddController implements Initializable {

    final String DB_URL = "jdbc:derby:StudentDB;";

    @FXML TableView<Student> studentListView;

    @FXML TableColumn stuName;
    @FXML TableColumn stuAge;
    @FXML TableColumn stuMajor;
    @FXML TableColumn stuGPA;


    @FXML ComboBox ageCB;

    @FXML ComboBox majorCB;

    @FXML ComboBox gpaCB;

    ObservableList<Student> studentList;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        studentList = FXCollections.observableArrayList();
        createDB();
        createStudentsDB();
        studentListView.setItems(studentList);
    }

    public void createDB(){
        try
        {
            Connection conn = DriverManager.getConnection("jdbc:derby:StudentDB;create=true");
            conn.close();
            System.out.println("Connection successful");
        }
        catch(Exception ex)
        {
            System.out.println("ERROR: " + ex.getMessage());
        }
    }

    public void createStudentsDB(){
        try{
            Connection conn = DriverManager.getConnection(DB_URL);

            Statement stmt = conn.createStatement();
            stmt.execute("DROP TABLE Student");

            stmt.execute("CREATE TABLE Student (" +
                    "Name CHAR(25), " +
                    "Age INT, " +
                    "Major CHAR(45), " +
                    "GPA DECIMAL, ");


            String sql = "INSERT INTO Student VALUES" +
                    "('Robert', 21, 'Computer Information Systems', 3.8)";
            stmt.executeUpdate(sql);


            String sqlStatement = "SELECT Name, Age, Major, GPA FROM Student";
            ResultSet result = stmt.executeQuery(sqlStatement);
            ObservableList<Student> studentList = FXCollections.observableArrayList();
            while (result.next())
            {
                Student newStudent = new Student();
                newStudent.name = result.getString("Name");
                newStudent.age = result.getInt("Age");
                newStudent.major = result.getString("Major");
                newStudent.gpa = result.getDouble("GPA");

                studentList.add(newStudent);
            }

            stmt.close();
            conn.close();

        }
        catch (Exception ex)
        {
            var msg = ex.getMessage();
            System.out.println(msg);
        }
    }
<TableView fx:id="studentListView" prefWidth="400">
  <columns>
    <TableColumn fx:id="stuName" text="Student" prefWidth="125"/>
    <TableColumn fx:id="stuAge" text="Age" prefWidth="75"/>
    <TableColumn fx:id="stuMajor" text="Major" prefWidth="125"/>
    <TableColumn fx:id="stuGPA" text="GPA" prefWidth="75"/>
  </columns>
</TableView>

我已经用我想要的4列在FXML中创建了TableView。我只是不知道如何将信息从数据库获取到TableView

1 个答案:

答案 0 :(得分:0)

此代码从Derby数据库读取表,该表名为Parent
我们正在使用MVC模型视图控制器模式
我们强烈建议您在使用任何数据库时都使用MVC概念

 private void ReadFromParent() throws SQLException{


ObservableList<ParentModel> TableData = FXCollections.observableArrayList();
    stmnt = conn.createStatement();
    ResultSet rs = stmnt.executeQuery("SELECT * FROM Parent"); 
    while (rs.next()){// Add data to observableArrayList TableData to select a table ROW

    TableData.add(new ParentModel(rs.getString("PID"),rs.getString("pMonth"),rs.getString("pYear")));
    }
    PropertyValueFactory<ParentModel, String> IDCellValueFactory = new PropertyValueFactory<>("PID");
    colID.setCellValueFactory(IDCellValueFactory);
    PropertyValueFactory<ParentModel, String> DateCellValueFactory = new PropertyValueFactory<>("pMonth");
    colMonth.setCellValueFactory(DateCellValueFactory);
    PropertyValueFactory<ParentModel, String> TypeCellValueFactory = new PropertyValueFactory<>("pYear");
    colYear.setCellValueFactory(TypeCellValueFactory);

    // ================================================================
    // colTxDate are the ID's for the tableview columns
    // sortDate  are the Column Names for the Database TABLE CDBalance
    // ================================================================
    colMonth.setStyle("-fx-alignment: CENTER;");
    colYear.setStyle("-fx-alignment:CENTER;");

    Collections.sort(TableData, (p2, p1)-> p1.getPID().compareToIgnoreCase(p2.getPID()));
    // Line of Code above Sorts Database Columns based on VARIABLE in ParentModel
    // Change p2,p1 to sort Ascending or Descending
    if(TableData.size() < 15) {// Format TableView to display Vertical ScrollBar
        ptable.setPrefWidth(336);// 19 is the off set
    }else {
        ptable.setPrefWidth(355);
    }   ptable.setItems(TableData);
    stmnt.close();  
}
相关问题