Bạn có thể truy cập MySQL từ JavaFX. Nhưng JavaFX chạy trên máy khách và một cái gì đó giống như php thường chạy trên máy chủ. Bạn sẽ cần kết nối từ ứng dụng java của mình tới MySQL. Vì nhà cung cấp dịch vụ lưu trữ của bạn không cho phép bạn kết nối trực tiếp với cổng cơ sở dữ liệu từ Ứng dụng khách Java của bạn, bạn sẽ cần một số cách khác để kết nối.
Bạn có thể chạy đường hầm qua cổng 80, bạn có thể chạy một servlet (hoặc mã máy chủ php, v.v.) để chặn lưu lượng đến và các cuộc gọi cơ sở dữ liệu proxy thông qua giao diện REST dựa trên HTTP hoặc bạn có thể cài đặt DB cục bộ trên máy khách.
Tôi sẽ giả định rằng, đối với một dự án trường học, mỗi máy khách có cơ sở dữ liệu riêng là được. Trong trường hợp đó, thay vì sử dụng MySQL, hãy sử dụng cơ sở dữ liệu Java nhẹ như H2 , gói nó với ứng dụng của bạn bằng cách bao gồm jar của nó làm thư viện phụ thuộc, gói ứng dụng cộng với DB jar dưới dạng ứng dụng WebStart đã ký sử dụng công cụ đóng gói JavaFX và lưu trữ các tệp được tạo bởi công cụ đóng gói tại nhà cung cấp dịch vụ lưu trữ của bạn.
Cập nhật
Đây là một ứng dụng mẫu sử dụng cơ sở dữ liệu H2 cục bộ trên máy khách.
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;
}
}
Có một dự án NetBeans tương ứng cho mẫu này sẽ tạo ra một ứng dụng có thể triển khai. Dự án có thể được kiểm tra trong webstart và applet chế độ.
Đối với mẫu, cơ sở dữ liệu được lưu trữ trên máy tính của người dùng (không phải máy chủ mà ứng dụng được tải xuống từ đó) và vẫn tồn tại giữa các lần chạy ứng dụng.
Vị trí chính xác phụ thuộc vào chuỗi khởi tạo kết nối jdbc. Trong trường hợp mẫu của tôi, cơ sở dữ liệu đi vào thư mục của người dùng jdbc:h2:~/test
, là Hệ điều hành và Người dùng cụ thể. Trong trường hợp của tôi dành cho Windows, nó kết thúc ở C:\Users\john_smith\test.h2.db
. Sử dụng chuỗi kết nối jdbc chẳng hạn như jdbc:h2:~/test
thích hợp hơn với một chuỗi chẳng hạn như jdbc:h2:C:\\Baza
bởi vì một chuỗi có C:\\
trong đó là nền tảng cụ thể và sẽ không hoạt động tốt trên các hệ thống không phải windows. Để biết thêm thông tin về chuỗi kết nối jdbc h2, hãy tham khảo cài đặt kết nối trong hướng dẫn sử dụng h2 .
Hệ thống h2 hoạt động sao cho nếu tệp cơ sở dữ liệu đã tồn tại, nó sẽ được sử dụng lại, nếu không thì một tệp cơ sở dữ liệu mới sẽ được tạo. Nếu bạn sửa đổi cơ sở dữ liệu, tắt ứng dụng, sau đó tải lại ứng dụng một tuần sau, nó có thể đọc dữ liệu được tạo tuần trước.