您可以从JavaFX访问MySQL。但是JavaFX运行在客户端上,而像php这样的东西通常运行在服务器上。您将需要从您的Java应用程序到MySQL的连接。由于您的托管服务提供商不允许您从Java客户端应用程序直接连接到数据库端口,因此您需要其他方式进行连接。您可以通过端口80隧道,您可以运行servlet(或php服务器代码等)通过基于HTTP的REST接口拦截传入流量和代理数据库调用,也可以在客户端本地安装数据库。

我打算假设,对于一个学校项目来说,每台客户机都可以拥有自己的数据库。在这种情况下,使用轻量级Java数据库(如H2),将它与您的应用捆绑在一起,方法是将它的jar作为依赖库包含在内,package应用程序加上DB jar作为使用JavaFX打包工具签名的WebStart应用程序,由托管服务提供商的打包工具生成的文件。

更新

这里是一个客户端计算机上使用本地数据库H2一个示例应用程序。

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 nameView = new ListView();

final Button fetchNames = new Button("Fetch names from the database");

fetchNames.setOnAction(new EventHandler() {

@Override public void handle(ActionEvent event) {

fetchNamesFromDatabaseToListView(nameView);

}

});

final Button clearNameList = new Button("Clear the name list");

clearNameList.setOnAction(new EventHandler() {

@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 fetchNames(Connection con) throws SQLException {

logger.info("Fetching names from database");

ObservableList 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;

}

}

对于该示例,数据库存储在用户的计算机(而不是从中下载应用程序的服务器)并在应用程序运行之间持续存在。

确切位置取决于jdbc连接初始化字符串。在我的示例中,数据库进入用户目录jdbc:h2:~/test,这是操作系统和用户特定的。在Windows的情况下,它结束于C:\Users\john_smith\test.h2.db。使用诸如jdbc:h2:~/test之类的jdbc连接字符串比诸如jdbc:h2:C:\\Baza之类的字符串更可取,因为其中的C:\\字符串是特定于平台的并且在非Windows系统上无法正常工作。有关h2 jdbc连接字符串的更多信息,请参阅connections settings in the h2 manual。

h2系统的工作原理是,如果数据库文件已经存在,它将被重用,否则会创建一个新的数据库文件。如果修改数据库,关闭应用程序,然后在一周后再次加载应用程序,则可以读取前一周创建的数据。

更多推荐