How to fill up a TableView with database data

前端 未结 3 1851
花落未央
花落未央 2020-11-30 08:12

I\'ve been trying to load a TableView with data queried from a database, but can\'t seem to get it to work.

This is my first attempt at trying to fill up a database

3条回答
  •  青春惊慌失措
    2020-11-30 08:48

    If Database contains different types of data, not only String, then column type assigning 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 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();
                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  type instead of , 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 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 SQL database "sqlbase_schema" contains a Table "sqlbase_table" with 3 columns: "id" (Integer(INT(11))), "name" (String(VARCHAR(45))), "married (Boolean(TINYINT(1)));

提交回复
热议问题