Du kan komma åt MySQL från JavaFX. Men JavaFX körs på en klient och något som php körs vanligtvis på en server. Du behöver en anslutning från din java-app till MySQL. Eftersom din värdleverantör inte tillåter dig att ansluta direkt till databasporten från din Java Client App, behöver du något annat sätt att ansluta.
Du kan tunnla genom port 80, du kan köra en servlet (eller php-serverkod, etc) för att avlyssna inkommande trafik och proxydatabasanrop via ett HTTP-baserat REST-gränssnitt eller så kan du installera DB lokalt på klienten.
Jag kommer att anta att det för ett skolprojekt är ok för varje klientdator att ha sin egen databas. I så fall, istället för att använda MySQL, använd en lätt Java-databas som H2 , kombinera den med din app genom att inkludera dess jar som ett beroende bibliotek, paket appen plus DB-burken som en signerad WebStart-applikation som använder JavaFX-paketeringsverktygen och är värd för filerna som genereras av paketeringsverktygen hos din värdleverantör.
Uppdatera
Här är ett exempelprogram som använder en lokal H2-databas på klientdatorn.
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;
}
}
Det finns ett motsvarande NetBeans-projekt för detta prov som kommer att generera en implementeringsbar applikation. Projektet kan testas i webstart och applet läge.
För exemplet lagras databasen på användarens dator (inte servern från vilken programmet laddades ner) och kvarstår mellan programkörningar.
Den exakta platsen beror på jdbc-anslutningsinitieringssträngen. När det gäller mitt exempel hamnar databasen i användarens katalog jdbc:h2:~/test
, som är OS- och användarspecifik. I fallet med mig för Windows hamnar det på C:\Users\john_smith\test.h2.db
. Använda en jdbc-anslutningssträng som jdbc:h2:~/test
är att föredra framför en sträng som jdbc:h2:C:\\Baza
eftersom en sträng med C:\\
i den är plattformsspecifik och fungerar inte bra på icke-Windows-system. För ytterligare information om h2 jdbc-anslutningssträngar, se anslutningsinställningarna i h2-manualen .
h2-systemet fungerar så att om databasfilen redan finns återanvänds den, annars skapas en ny databasfil. Om du ändrar databasen, stänger du av applikationen och laddar sedan applikationen igen en vecka senare, den kan läsa data som skapades veckan innan.