Anda dapat mengakses MySQL dari JavaFX. Tapi JavaFX berjalan di klien dan sesuatu seperti php biasanya berjalan di server. Anda akan memerlukan koneksi dari aplikasi java Anda ke MySQL. Karena penyedia hosting Anda tidak mengizinkan Anda untuk terhubung langsung ke port database dari Aplikasi Klien Java Anda, Anda memerlukan cara lain untuk terhubung.
Anda dapat melakukan tunnel melalui port 80, Anda dapat menjalankan servlet (atau kode server php, dll) untuk mencegat lalu lintas masuk dan panggilan database proxy melalui antarmuka REST berbasis HTTP atau Anda dapat menginstal DB secara lokal pada klien.
Saya akan berasumsi, untuk proyek sekolah, boleh saja setiap mesin klien memiliki databasenya sendiri. Dalam hal ini, daripada menggunakan MySQL, gunakan database Java yang ringan seperti H2 , bundel dengan aplikasi Anda dengan menyertakan toplesnya sebagai pustaka dependen, paket aplikasi plus DB jar sebagai aplikasi WebStart yang ditandatangani menggunakan alat pengemasan JavaFX dan menghosting file yang dihasilkan oleh alat pengemasan di penyedia hosting Anda.
Perbarui
Berikut adalah contoh aplikasi yang menggunakan database H2 lokal di komputer klien.
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;
}
}
Ada proyek NetBeans yang sesuai untuk sampel ini yang akan menghasilkan aplikasi yang dapat digunakan. Proyek dapat diuji di webstart dan applet modus.
Sebagai contoh, database disimpan di komputer pengguna (bukan server tempat aplikasi diunduh) dan tetap ada di antara aplikasi yang berjalan.
Lokasi yang tepat tergantung pada string inisialisasi koneksi jdbc. Dalam kasus sampel saya, database masuk ke direktori pengguna jdbc:h2:~/test
, yang khusus untuk OS dan Pengguna. Dalam kasus saya untuk Windows berakhir di C:\Users\john_smith\test.h2.db
. Menggunakan string koneksi jdbc seperti jdbc:h2:~/test
lebih disukai daripada string seperti jdbc:h2:C:\\Baza
karena string dengan C:\\
di dalamnya adalah platform khusus dan tidak akan bekerja dengan baik pada sistem non-windows. Untuk informasi lebih lanjut tentang string koneksi jdbc h2 lihat pengaturan koneksi di manual h2 .
Sistem h2 bekerja sedemikian rupa sehingga jika file database sudah ada, digunakan kembali, jika tidak file database baru dibuat. Jika Anda memodifikasi database, mematikan aplikasi, kemudian memuat aplikasi lagi seminggu kemudian, itu dapat membaca data yang dibuat minggu sebelumnya.