2014-09-03 16 views
7

Qualcuno mi può dare un esempio di una classe che collega JavaFX con MySQL, non desidero Classe principale, avere uno, vogliono solo un esempio di una classe che collega tutte le applicazioni a un database MySQL e ottiene una fila da quel database in un tavolo, ho cercato l'intero internet e non ho trovato nulla di preciso al punto che non voglio niente di speciale solo qualcosa per ottenere il lavoro fatto per favore. Qualcosa di pulito e semplice.JavaFX MySQL si prega

+0

Non si dovrebbe fare questo con una sola classe: è molto cattiva pratica di miscelare questi pezzi diversi di funzionalità (connessione al database, da un lato, l'interfaccia utente d'altra parte) in un unico luogo. Separalo in diversi componenti. –

+0

@James_D non ho detto di farlo con una sola classe I ment che voglio un buon esempio semplice pulito e chiaro di una classe che collega il mio progetto JavaFX per un database MySQL e un esempio di come ottenere i dati dal database in un tavolo. Non ho mai visto niente di simile su Google o YouTube o Facebook o StackOverflow ecc – marcS

+0

Beh, ci sono centinaia di esempi di visualizzazione dei dati in un 'TableView', e centinaia di esempi di recupero di dati da un database. Metterò qualcosa insieme ma non sono sicuro di cosa esista che non esista altrove. –

risposta

16

Come minimo, sono necessarie tre classi: una per rappresentare i dati, una per l'interfaccia utente e l'altra per gestire la connessione al database. In una vera app ti servirebbe di più, naturalmente. Questo esempio segue lo stesso esempio di base come il TableView tutorial

Supponiamo che il vostro database ha un tavolo person con tre colonne, first_name, last_name, email_address.

allora si sarebbe scrivere una classe Person:

import javafx.beans.property.StringProperty ; 
import javafx.beans.property.SimpleStringProperty ; 

public class Person { 
    private final StringProperty firstName = new SimpleStringProperty(this, "firstName"); 
    public StringProperty firstNameProperty() { 
     return firstName ; 
    } 
    public final String getFirstName() { 
     return firstNameProperty().get(); 
    } 
    public final void setFirstName(String firstName) { 
     firstNameProperty().set(firstName); 
    } 

    private final StringProperty lastName = new SimpleStringProperty(this, "lastName"); 
    public StringProperty lastNameProperty() { 
     return lastName ; 
    } 
    public final String getLastName() { 
     return lastNameProperty().get(); 
    } 
    public final void setLastName(String lastName) { 
     lastNameProperty().set(lastName); 
    } 

    private final StringProperty email = new SimpleStringProperty(this, "email"); 
    public StringProperty emailProperty() { 
     return email ; 
    } 
    public final String getEmail() { 
     return emailProperty().get(); 
    } 
    public final void setEmail(String email) { 
     emailProperty().set(email); 
    } 

    public Person() {} 

    public Person(String firstName, String lastName, String email) { 
     setFirstName(firstName); 
     setLastName(lastName); 
     setEmail(email); 
    } 

} 

Una classe per accedere ai dati dal database:

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

import java.util.List ; 
import java.util.ArrayList ; 

public class PersonDataAccessor { 

    // in real life, use a connection pool.... 
    private Connection connection ; 

    public PersonDataAccessor(String driverClassName, String dbURL, String user, String password) throws SQLException, ClassNotFoundException { 
     Class.forName(driverClassName); 
     connection = DriverManager.getConnection(dbURL, user, password); 
    } 

    public void shutdown() throws SQLException { 
     if (connection != null) { 
      connection.close(); 
     } 
    } 

    public List<Person> getPersonList() throws SQLException { 
     try (
      Statement stmnt = connection.createStatement(); 
      ResultSet rs = stmnt.executeQuery("select * from person"); 
     ){ 
      List<Person> personList = new ArrayList<>(); 
      while (rs.next()) { 
       String firstName = rs.getString("first_name"); 
       String lastName = rs.getString("last_name"); 
       String email = rs.getString("email_address"); 
       Person person = new Person(firstName, lastName, email); 
       personList.add(person); 
      } 
      return personList ; 
     } 
    } 

    // other methods, eg. addPerson(...) etc 
} 

E poi una classe di interfaccia utente:

import javafx.application.Application ; 
import javafx.scene.control.TableView ; 
import javafx.scene.control.TableColumn ; 
import javafx.scene.control.cell.PropertyValueFactory ; 
import javafx.scene.layout.BorderPane ; 
import javafx.scene.Scene ; 
import javafx.stage.Stage ; 

public class PersonTableApp extends Application { 
    private PersonDataAccessor dataAccessor ; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     dataAccessor = new PersonDataAccessor(...); // provide driverName, dbURL, user, password... 

     TableView<Person> personTable = new TableView<>(); 
     TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name"); 
     firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName")); 
     TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name"); 
     lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName")); 
     TableColumn<Person, String> emailCol = new TableColumn<>("Email"); 
     emailCol.setCellValueFactory(new PropertyValueFactory<>("email")); 

     personTable.getColumns().addAll(firstNameCol, lastNameCol, emailCol); 

     personTable.getItems().addAll(dataAccessor.getPersonList()); 

     BorderPane root = new BorderPane(); 
     root.setCenter(personTable); 
     Scene scene = new Scene(root, 600, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void stop() throws Exception { 
     if (dataAccessor != null) { 
      dataAccessor.shutdown(); 
     } 
    } 

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

(L'ho appena inserito senza test, quindi potrebbero esserci errori di battitura, importazioni mancanti, ecc., Ma va bene ULD essere sufficiente per dare l'idea)

+0

grazie mille – marcS

+0

Risposta stupenda. Grazie! –

1

Oltre alla risposta di James_D:.

ho voluto per connettersi a un database remoto (MySQL), così ho cambiato il costruttore e collegati da url-only:

public UserAccessor(String dbURL, String user, String password) throws SQLException, ClassNotFoundException { 
    connection = DriverManager.getConnection(dbURL, user, password); 
} 

Init via:

UserAccessor userAccessor = new UserAccessor(
    "jdbc:mysql://xxx.xxx.xxx.xxx:YOUR_PORT", "YOUR_DB_USER", "YOUR_PASSWORD") 

Si prega di notare: sarà inoltre necessario includere il connettore lib. Ho scelto mysql-connector-java-5.1.40-bin.jar che è venuto con IntelliJ e si trovava sotto /Users/martin/Library/Preferences/IntelliJIdea2017.1/jdbc-drivers/MySQL Connector/J/5.1.40/mysql-connector-java-5.1.40-bin.jar

Complimenti appartengono James_D.

Problemi correlati