Puede acceder a MySQL desde JavaFX. Pero JavaFX se ejecuta en un cliente y algo como php generalmente se ejecuta en un servidor. Necesitará una conexión desde su aplicación Java a MySQL. Como su proveedor de alojamiento no le permitirá conectarse directamente al puerto de la base de datos desde su aplicación Java Client, necesitará alguna otra forma de conectarse.
Puede hacer un túnel a través del puerto 80, puede ejecutar un servlet (o un código de servidor php, etc.) para interceptar el tráfico entrante y las llamadas a la base de datos proxy a través de una interfaz REST basada en HTTP o puede instalar la base de datos localmente en el cliente.
Asumiré que, para un proyecto escolar, está bien que cada máquina cliente tenga su propia base de datos. En cuyo caso, en lugar de usar MySQL, use una base de datos Java liviana como H2 , combínelo con su aplicación incluyendo su jar como una biblioteca dependiente, package la aplicación más DB jar como una aplicación WebStart firmada que utiliza las herramientas de empaquetado de JavaFX y aloja los archivos generados por las herramientas de empaquetado en su proveedor de alojamiento.
Actualizar
Aquí hay una aplicación de muestra que usa una base de datos H2 local en la computadora del cliente.
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;
}
}
Hay un proyecto de NetBeans correspondiente para esta muestra que generará una aplicación desplegable. El proyecto se puede probar en webstart y subprograma modo.
Para la muestra, la base de datos se almacena en la computadora del usuario (no en el servidor desde el cual se descargó la aplicación) y persiste entre las ejecuciones de la aplicación.
La ubicación exacta depende de la cadena de inicialización de la conexión jdbc. En el caso de mi muestra, la base de datos va en el directorio del usuario jdbc:h2:~/test
, que es específico del sistema operativo y del usuario. En mi caso para Windows, termina en C:\Users\john_smith\test.h2.db
. Usando una cadena de conexión jdbc como jdbc:h2:~/test
es preferible a una cadena como jdbc:h2:C:\\Baza
porque una cadena con C:\\
en él es específico de la plataforma y no funcionará bien en sistemas que no sean de Windows. Para obtener más información sobre las cadenas de conexión h2 jdbc, consulte la configuraciones de conexión en el manual de h2 .
El sistema h2 funciona de tal manera que si el archivo de base de datos ya existe, se reutiliza; de lo contrario, se crea un nuevo archivo de base de datos. Si modifica la base de datos, cierra la aplicación y vuelve a cargarla una semana después, podrá leer los datos creados la semana anterior.