Du kan få adgang til MySQL fra JavaFX. Men JavaFX kører på en klient, og noget som php kører normalt på en server. Du skal bruge en forbindelse fra din java-app til MySQL. Da din hostingudbyder ikke tillader dig at oprette forbindelse direkte til databaseporten fra din Java Client App, skal du bruge en anden måde at oprette forbindelse på.
Du kan tunnelere gennem port 80, du kan køre en servlet (eller php-serverkode osv.) for at opsnappe indgående trafik og proxy-databasekald gennem en HTTP-baseret REST-grænseflade, eller du kan installere DB'en lokalt på klienten.
Jeg vil antage, at det for et skoleprojekt er ok for hver klientmaskine at have sin egen database. I så fald, i stedet for at bruge MySQL, skal du bruge en letvægts Java-database som H2 , sæt den sammen med din app ved at inkludere dens jar som et afhængigt bibliotek, pakke appen plus DB-krukken som en signeret WebStart-applikation ved hjælp af JavaFX-pakkeværktøjerne og host de filer, der genereres af pakkeværktøjerne hos din hostingudbyder.
Opdater
Her er et eksempel på en applikation, som bruger en lokal H2-database på klientcomputeren.
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;
}
}
Der er et tilsvarende NetBeans-projekt for denne prøve, som vil generere en applikation, der kan implementeres. Projektet kan testes i webstart og applet tilstand.
For eksemplet er databasen gemt på brugerens computer (ikke serveren, hvorfra applikationen blev downloadet) og fortsætter mellem applikationskørsler.
Den nøjagtige placering afhænger af jdbc-forbindelsens initialiseringsstreng. I tilfælde af mit eksempel går databasen i brugerens mappe jdbc:h2:~/test
, som er OS- og brugerspecifik. I tilfældet med mig til Windows ender den på C:\Users\john_smith\test.h2.db
. Brug af en jdbc-forbindelsesstreng såsom jdbc:h2:~/test
er at foretrække frem for en streng såsom jdbc:h2:C:\\Baza
fordi en streng med C:\\
i den er platformspecifik og vil ikke fungere godt på ikke-Windows-systemer. For yderligere information om h2 jdbc-forbindelsesstrenge henvises til forbindelsesindstillingerne i h2-manualen .
h2 systemet fungerer sådan, at hvis databasefilen allerede eksisterer, genbruges den, ellers oprettes en ny databasefil. Hvis du ændrer databasen, skal du lukke applikationen ned og derefter indlæse applikationen igen en uge senere, den er i stand til at læse de data, der blev oprettet ugen før.