If the database contains different data types, not just String, then the purpose of the column is better to make dynamic:
package sample; import javafx.application.Application; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import java.sql.*; import java.util.ArrayList; import java.util.TimeZone; //Author: Yerbol //SQL database "sqlbase_schema" contains a Table "sqlbase_table" with 3 columns: "id" (Integer(INT(11))), "name" (String(VARCHAR(45))), "married" (Boolean(TINYINT(1))); public class Main extends Application { private TableView<Person> tableView = new TableView<>(); @Override public void start(Stage primaryStage) throws SQLException, ClassNotFoundException { //Show window buildData(); Parent root = tableView; primaryStage.setScene(new Scene(root, 300, 275)); primaryStage.show(); } public void buildData() throws ClassNotFoundException, SQLException { Connection dbConnection; //SQL Database connection params String dbHost = "localhost"; String dbPort = "3306"; String dbUser = "root"; String dbPassword = "12345"; String dbName = "sqlbase_schema"; String dbTableName = "sqlbase_table"; String select = "SELECT * FROM " + dbTableName; String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort +"/" + dbName+"?useLegacyDatetimeCode=false&&serverTimezone=" + TimeZone.getDefault().getID(); Class.forName("com.mysql.cj.jdbc.Driver"); //Connecting to Database dbConnection = DriverManager.getConnection(connectionString, dbUser, dbPassword); //Extracting data from Databasee ResultSet resultSet = null; try { PreparedStatement preparedStatement = dbConnection.prepareStatement(select); resultSet = preparedStatement.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } ObservableList dbData = FXCollections.observableArrayList(dataBaseArrayList(resultSet)); //Giving readable names to columns for(int i=0 ; i<resultSet.getMetaData().getColumnCount(); i++) { TableColumn column = new TableColumn<>(); switch (resultSet.getMetaData().getColumnName(i+1)) { case "id": column.setText("ID #"); break; case "name": column.setText("Person Name"); break; case "married": column.setText("Marital Status"); break; default: column.setText(resultSet.getMetaData().getColumnName(i+1)); //if column name in SQL Database is not found, then TableView column receive SQL Database current column name (not readable) break; } column.setCellValueFactory(new PropertyValueFactory<>(resultSet.getMetaData().getColumnName(i+1))); //Setting cell property value to correct variable from Person class. tableView.getColumns().add(column); } //Filling up tableView with data tableView.setItems(dbData); } public class Person { IntegerProperty id = new SimpleIntegerProperty(); //variable names should be exactly as column names in SQL Database Table. In case if you want to use <int> type instead of <IntegerProperty>, then you need to use getter/setter procedures instead of xxxProperty() below StringProperty name = new SimpleStringProperty(); BooleanProperty married = new SimpleBooleanProperty(); public IntegerProperty idProperty() { //name should be exactly like this [IntegerProperty variable name (id) + (Property) = idProperty] (case sensitive) return id; } public StringProperty nameProperty() { return name; } public BooleanProperty marriedProperty() { return married; } public Person(int idValue, String nameValue, boolean marriedValue) { id.set(idValue); name.set(nameValue); married.set(marriedValue); } Person(){} } //extracting data from ResulSet to ArrayList private ArrayList dataBaseArrayList(ResultSet resultSet) throws SQLException { ArrayList<Person> data = new ArrayList<>(); while (resultSet.next()) { Person person = new Person(); person.id.set(resultSet.getInt("id")); person.name.set(resultSet.getString("name")); person.married.set(resultSet.getBoolean("married")); data.add(person); } return data; } public static void main(String[] args) { launch(args); } }
In this example, the SQL database "sqlbase_schema" contains the table "sqlbase_table" with three columns: "id" (Integer (INT (11))), "name" (String (VARCHAR (45))), "married (Boolean (TINYINT ) (1)));
source share