JavaFX から MySQL にアクセスできます。しかし、JavaFX はクライアント上で実行され、php のようなものは通常サーバー上で実行されます。Java アプリから MySQL への接続が必要になります。ホスティング プロバイダーは、Java クライアント アプリからデータベース ポートに直接接続することを許可していないため、別の方法で接続する必要があります。
ポート 80 を介してトンネリングしたり、サーブレット (または php サーバー コードなど) を実行して着信トラフィックを傍受したり、HTTP ベースの REST インターフェイスを介してデータベース呼び出しをプロキシしたり、DB をクライアントにローカルにインストールしたりできます。
学校のプロジェクトでは、各クライアント マシンが独自のデータベースを持っていても問題ないと仮定します。その場合、MySQL を使用する代わりに、H2のような軽量の Java データベースを使用し、その jar を依存ライブラリとして含めることでアプリにバンドルし、JavaFXパッケージツールを使用してアプリと DB jar を署名付き 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<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;
}
}
このサンプルには、配備可能なアプリケーションを生成する、対応する NetBeans プロジェクトがあります。プロジェクトは、webstartおよびアプレットモードでテストできます。
サンプルの場合、データベースは (アプリケーションのダウンロード元のサーバーではなく) ユーザーのコンピューターに格納され、アプリケーションの実行間で保持されます。
正確な場所は、jdbc 接続の初期化文字列によって異なります。私のサンプルの場合、データベースはユーザーのディレクトリjdbc:h2:~/test
に入ります。これは、OS とユーザー固有です。Windows の私の場合、最終的にはC:\Users\john_smith\test.h2.db
. などの jdbc 接続文字列を使用するjdbc:h2:~/test
ことは、 などの文字列よりも推奨されます。その中に含まれるjdbc:h2:C:\\Baza
文字列C:\\
はプラットフォーム固有であり、Windows 以外のシステムではうまく機能しないためです。h2 jdbc 接続文字列の詳細については、h2 マニュアルの接続設定を参照してください。
h2 システムは、データベース ファイルが既に存在する場合は再利用され、存在しない場合は新しいデータベース ファイルが作成されるように機能します。データベースを変更してアプリケーションをシャットダウンし、1 週間後にアプリケーションを再度ロードすると、前の週に作成されたデータを読み取ることができます。