Puoi accedere a MySQL da JavaFX. Ma JavaFX viene eseguito su un client e qualcosa come php di solito viene eseguito su un server. Avrai bisogno di una connessione dalla tua app java a MySQL. Poiché il tuo provider di hosting non ti consentirà di connetterti direttamente alla porta del database dalla tua app client Java, avrai bisogno di un altro modo per connetterti.
È possibile eseguire il tunneling attraverso la porta 80, eseguire un servlet (o un codice del server php, ecc.) per intercettare il traffico in entrata e le chiamate proxy del database tramite un'interfaccia REST basata su HTTP oppure installare il DB localmente sul client.
Presumo che, per un progetto scolastico, va bene che ogni macchina client abbia il proprio database. In tal caso, invece di usare MySQL, usa un database Java leggero come H2 , raggruppalo con la tua app includendo il suo jar come libreria dipendente, pacchetto l'app più DB jar come applicazione WebStart firmata che utilizza gli strumenti di confezionamento JavaFX e ospita i file generati dagli strumenti di confezionamento presso il tuo provider di hosting.
Aggiorna
Ecco un'applicazione di esempio che utilizza un database H2 locale sul computer client.
import java.sql.*;
import java.util.logging.*;
import javafx.application.Application;
import javafx.collections.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
public class H2app extends Application {
private static final Logger logger = Logger.getLogger(H2app.class.getName());
private static final String[] SAMPLE_NAME_DATA = { "John", "Jill", "Jack", "Jerry" };
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
final ListView<String> nameView = new ListView();
final Button fetchNames = new Button("Fetch names from the database");
fetchNames.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
fetchNamesFromDatabaseToListView(nameView);
}
});
final Button clearNameList = new Button("Clear the name list");
clearNameList.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
nameView.getItems().clear();
}
});
VBox layout = new VBox(10);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;");
layout.getChildren().setAll(
HBoxBuilder.create().spacing(10).children(
fetchNames,
clearNameList
).build(),
nameView
);
layout.setPrefHeight(200);
stage.setScene(new Scene(layout));
stage.show();
}
private void fetchNamesFromDatabaseToListView(ListView listView) {
try (Connection con = getConnection()) {
if (!schemaExists(con)) {
createSchema(con);
populateDatabase(con);
}
listView.setItems(fetchNames(con));
} catch (SQLException | ClassNotFoundException ex) {
logger.log(Level.SEVERE, null, ex);
}
}
private Connection getConnection() throws ClassNotFoundException, SQLException {
logger.info("Getting a database connection");
Class.forName("org.h2.Driver");
return DriverManager.getConnection("jdbc:h2:~/test", "sa", "");
}
private void createSchema(Connection con) throws SQLException {
logger.info("Creating schema");
Statement st = con.createStatement();
String table = "create table employee(id integer, name varchar(64))";
st.executeUpdate(table);
logger.info("Created schema");
}
private void populateDatabase(Connection con) throws SQLException {
logger.info("Populating database");
Statement st = con.createStatement();
int i = 1;
for (String name: SAMPLE_NAME_DATA) {
st.executeUpdate("insert into employee values(i,'" + name + "')");
i++;
}
logger.info("Populated database");
}
private boolean schemaExists(Connection con) {
logger.info("Checking for Schema existence");
try {
Statement st = con.createStatement();
st.executeQuery("select count(*) from employee");
logger.info("Schema exists");
} catch (SQLException ex) {
logger.info("Existing DB not found will create a new one");
return false;
}
return true;
}
private ObservableList<String> fetchNames(Connection con) throws SQLException {
logger.info("Fetching names from database");
ObservableList<String> names = FXCollections.observableArrayList();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select name from employee");
while (rs.next()) {
names.add(rs.getString("name"));
}
logger.info("Found " + names.size() + " names");
return names;
}
}
Esiste un progetto NetBeans corrispondente per questo esempio che genererà un'applicazione distribuibile. Il progetto può essere testato in webstart e applet modalità.
Per l'esempio, il database viene archiviato nel computer dell'utente (non nel server da cui è stata scaricata l'applicazione) e persiste tra le esecuzioni dell'applicazione.
La posizione esatta dipende dalla stringa di inizializzazione della connessione jdbc. Nel caso del mio campione il database va nella directory dell'utente jdbc:h2:~/test
, che è specifico del sistema operativo e dell'utente. Nel caso di me per Windows finisce in C:\Users\john_smith\test.h2.db
. Utilizzando una stringa di connessione jdbc come jdbc:h2:~/test
è preferibile a una stringa come jdbc:h2:C:\\Baza
perché una stringa con C:\\
in esso è specifico della piattaforma e non funzionerà bene su sistemi non Windows. Per ulteriori informazioni sulle stringhe di connessione jdbc di h2, fare riferimento alle impostazioni delle connessioni nel manuale di h2 .
Il sistema h2 funziona in modo tale che se il file di database esiste già, viene riutilizzato, altrimenti viene creato un nuovo file di database. Se modifichi il database, chiudi l'applicazione, quindi carichi nuovamente l'applicazione una settimana dopo, sarà in grado di leggere i dati creati la settimana prima.