How To Display Data From Mysql Database In A Javafx Tableview

How To Display Data From Mysql Database In A Javafx Tableview

Here is an explanation of the code above:

  1. The Main class extends the Application class and overrides the start method. This is the entry point for a JavaFX application.
  2. A TableView object is created and three TableColumn objects are created for the Employee ID, First Name, and Last Name fields.
  3. The cellValueFactory property of each TableColumn is set using the PropertyValueFactory class. This specifies the field in the Employee class that should be displayed in the column.
  4. The columns are added to the TableView using the getColumns().addAll() method.
  5. An ObservableList object is created to store the data for the TableView. The loadData method is called to load the data from the database and add it to the ObservableList.
  6. The setItems method is used to set the data for the TableView.
  7. The TableView is added to a StackPane layout and the layout is added to a Scene. The scene is displayed in the Stage.
  8. The loadData method connects to the MySQL database using the JDBC driver, executes a SELECT statement to retrieve the data from the Employees table, and iterates through the ResultSet creating an Employee object for each row. The Employee objects are added to the ObservableList.
  9. The Employee class is a simple Java class with fields for the Employee ID, First Name, and Last Name. It also has getter and setter methods for these fields.

To display the rows of the Employees table in a JavaFX TableView with each column representing a different field, you can use the following code:




import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql. Statement;

public class Main extends Application {

    private ObservableList<Employee> data;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        // Create the TableView
        TableView<Employee> table = new TableView<>();

        // Create the columns
        TableColumn<Employee, String> idColumn = new TableColumn<>("Employee ID");
        idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
        TableColumn<Employee, String> firstNameColumn = new TableColumn<>("First Name");
        firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        TableColumn<Employee, String> lastNameColumn = new TableColumn<>("Last Name");
        lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));

        // Add the columns to the TableView
        table.getColumns().addAll(idColumn, firstNameColumn, lastNameColumn);

        // Load the data from the database
        data = FXCollections.observableArrayList();
        loadData();

        // Set the items in the TableView
        table.setItems(data);

        // Add the TableView to the scene
        StackPane root = new StackPane();
        root.getChildren().add(table);
        Scene scene = new Scene(root, 600, 400);
        stage.setScene(scene);
        stage.show();
    }

    private void loadData() {
        try {
            // Connect to the database
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb", "username", "password");
             Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM Employees");

            // Iterate through the ResultSet and create Employee objects for each row
            while (rs.next()) {
                int id = rs.getInt("EmployeeID");
                String firstName = rs.getString("FirstName");
                String lastName = rs.getString("LastName");
                data.add(new Employee(id, firstName, lastName));
            }

            // Close the connection
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


Here is the Employee class that is used in the code above:




public class Employee {
    private final SimpleStringProperty id;
    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;

    public Employee(int id, String firstName, String lastName) {
        this.id = new SimpleStringProperty(Integer.toString(id));
        this.firstName = new SimpleStringProperty(firstName);
        this.lastName = new SimpleStringProperty(lastName);
    }

    public String getId() {
        return id.get();
    }

    public void setId(String id) {
        this.id.set(id);
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String firstName) {
        this.firstName.set(firstName);
    }

    public String getLastName() {
        return lastName.get();
    }

    public void setLastName(String lastName) {
        this.lastName.set(lastName);
    }
}

This class has three fields: id, firstName, and lastName. Each field is represented by a SimpleStringProperty object, which is a JavaFX class that allows the field to be observed by other objects. The class also has getter and setter methods for each field.

The Employee class is used to represent each row of data in the Employees table. The PropertyValueFactory class in the TableColumn objects uses the getter methods to access the values for each field in the Employee objects.

You will need to add the mysql-connector-java library to your project in order to use the JDBC driver. You can do this by adding the following dependency to your build file (e.g., pom.xml if you are using Maven):




<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.22</version>
</dependency>

Alternatively, you can download the library from the MySQL website and add it to your classpath manually.

Here is an example of the Employees table in MySQL:




+------------+------------+----------+
| EmployeeID | FirstName  | LastName |
+------------+------------+----------+
|          1 | John       | Smith    |
|          2 | Jane       | Doe      |
|          3 | Bob        | Johnson   |
+------------+------------+----------+

This table has three columns: EmployeeID, FirstName, and LastName. Each row represents a different employee, with their unique EmployeeID and their first and last names.

You can use the following SQL statement to create this table in a MySQL database:

CREATE TABLE Employees (
  EmployeeID INT PRIMARY KEY,
  FirstName VARCHAR(255),
  LastName VARCHAR(255)
);

You can then use INSERT statements to add rows to the table:




INSERT INTO Employees (EmployeeID, FirstName, LastName) VALUES (1, 'John', 'Smith');
INSERT INTO Employees (EmployeeID, FirstName, LastName) VALUES (2, 'Jane', 'Doe');
INSERT INTO Employees (EmployeeID, FirstName, LastName) VALUES (3, 'Bob', 'Johnson');


Certainly! Here is an alternative implementation of the Employee class that does not use SimpleStringProperty:




public class Employee {
    private int id;
    private String firstName;
    private String lastName;

    public Employee(int id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

In this version of the Employee class, the fields are simply represented as primitive types or String objects. The getter and setter methods are also more straightforward.

To use this version of the Employee class with the TableView, you will need to make a few changes to the code:

  1. Change the type parameter of the TableView and TableColumn objects to Employee:
TableView<Employee> table = new TableView<>();
TableColumn<Employee, Integer> idColumn = new TableColumn<>("Employee ID");
TableColumn<Employee, String> firstNameColumn = new TableColumn<>("First Name");
TableColumn<Employee, String> lastNameColumn = new TableColumn<>("Last Name");

  1. Change the cellValueFactory for each TableColumn to use the appropriate getter method:



idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));

Here is the complete code for displaying data from a MySQL database in a JavaFX TableView using the Employee class represented as primitive types without using SimpleStringProperty:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main extends Application {

    private ObservableList<Employee> data;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        // Create the TableView
        TableView<Employee> table = new TableView<>();

        // Create the columns
        TableColumn<Employee, Integer> idColumn = new TableColumn<>("Employee ID");
        idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
        TableColumn<Employee, String> firstNameColumn = new TableColumn<>("First Name");
        firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        TableColumn<Employee, String> lastNameColumn = new TableColumn<>("Last Name");
        lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));

        // Add the columns to the TableView
        table.getColumns().addAll(idColumn, firstNameColumn, lastNameColumn);

        // Load the data from the database
        data = FXCollections.observableArrayList();
        loadData();

        // Set the items in the TableView
        table.setItems(data);

Here is an explanation of the code above:

  1. The Main class extends the Application class and overrides the start method. This is the entry point for a JavaFX application.
  2. A TableView object is created and three TableColumn objects are created for the Employee ID, First Name, and Last Name fields.
  3. The cellValueFactory property of each TableColumn is set using the PropertyValueFactory class. This specifies the field in the Employee class that should be displayed in the column.
  4. The columns are added to the TableView using the getColumns().addAll() method.
  5. An ObservableList object is created to store the data for the TableView. The loadData method is called to load the data from the database and add it to the ObservableList.
  6. The setItems method is used to set the data for the TableView.
  7. The TableView is added to a StackPane layout and the layout is added to a Scene. The scene is displayed in the Stage.
  8. The loadData method connects to the MySQL database using the JDBC driver, executes a SELECT statement to retrieve the data from the Employees table, and iterates through the ResultSet creating an Employee object for each row. The Employee objects are added to the ObservableList.
  9. The Employee class is a simple Java class with fields for the Employee ID, First Name, and Last Name. It also has getter and setter methods for these fields. In this version of the class, the fields are represented as primitive types or String objects instead of SimpleStringProperty objects.

Here is the complete code for displaying data from a MySQL database in a JavaFX TableView using the Employee class represented as primitive types without using SimpleStringProperty:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main extends Application {

    private ObservableList<Employee> data;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        // Create the TableView
        TableView<Employee> table = new TableView<>();

        // Create the columns
        TableColumn<Employee, Integer> idColumn = new TableColumn<>("Employee ID");
        idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
        TableColumn<Employee, String> firstNameColumn = new TableColumn<>("First Name");
        firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        TableColumn<Employee, String> lastNameColumn = new TableColumn<>("Last Name");
        lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));

        // Add the columns to the TableView
        table.getColumns().addAll(idColumn, firstNameColumn, lastNameColumn);

        // Load the data from the database
        data = FXCollections.observableArrayList();
        loadData();

        // Set the items in the TableView
        table.setItems(data);

        // Add the TableView to the scene
        StackPane root = new StackPane();
        root.getChildren().add(table);
        Scene scene = new Scene(root, 600, 400);
        stage.setScene(scene);
        stage.show();
    }

    private void loadData() {
        try {
            // Connect to the database
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb", "username", "password");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM Employees");

            // Iterate through the ResultSet and create Employee objects for each row
            while (rs.next()) {
                int id = rs.getInt("EmployeeID");
                String firstName = rs.getString("FirstName");
                String lastName = rs.getString("LastName");
                data.add(new Employee(id, firstName, lastName));
            }

            // Close the connection
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *