आप JavaFX से MySQL को एक्सेस कर सकते हैं। लेकिन जावाएफएक्स क्लाइंट पर चलता है और PHP जैसा कुछ आमतौर पर सर्वर पर चलता है। आपको अपने जावा ऐप से MySQL से कनेक्शन की आवश्यकता होगी। चूंकि आपका होस्टिंग प्रदाता आपको अपने जावा क्लाइंट ऐप से सीधे डेटाबेस पोर्ट से कनेक्ट करने की अनुमति नहीं देगा, इसलिए आपको कनेक्ट करने के लिए किसी अन्य तरीके की आवश्यकता होगी।
आप पोर्ट 80 के माध्यम से सुरंग बना सकते हैं, आप HTTP आधारित आरईएसटी इंटरफ़ेस के माध्यम से आने वाले यातायात और प्रॉक्सी डेटाबेस कॉल को रोकने के लिए एक सर्वलेट (या PHP सर्वर कोड, आदि) चला सकते हैं या आप क्लाइंट पर स्थानीय रूप से डीबी स्थापित कर सकते हैं।
मुझे लगता है कि, एक स्कूल प्रोजेक्ट के लिए, प्रत्येक क्लाइंट मशीन के लिए इसका अपना डेटाबेस होना ठीक है। ऐसी स्थिति में, MySQL का उपयोग करने के बजाय, हल्के जावा डेटाबेस का उपयोग करें जैसे H2 , एक आश्रित पुस्तकालय के रूप में इसके जार को शामिल करके इसे अपने ऐप के साथ बंडल करें, packageए> जावाएफएक्स पैकेजिंग टूल का उपयोग करके एक हस्ताक्षरित वेबस्टार्ट एप्लिकेशन के रूप में ऐप प्लस डीबी जार और अपने होस्टिंग प्रदाता पर पैकेजिंग टूल द्वारा उत्पन्न फाइलों को होस्ट करें।
अपडेट करें
यहाँ एक नमूना अनुप्रयोग है जो क्लाइंट कंप्यूटर पर स्थानीय 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 और उपयोगकर्ता विशिष्ट है। विंडोज़ के लिए मेरे मामले में यह C:\Users\john_smith\test.h2.db
पर समाप्त होता है . jdbc कनेक्शन स्ट्रिंग का उपयोग करना जैसे कि jdbc:h2:~/test
एक स्ट्रिंग के लिए बेहतर है जैसे कि jdbc:h2:C:\\Baza
क्योंकि C:\\
. के साथ एक स्ट्रिंग इसमें प्लेटफ़ॉर्म विशिष्ट है और गैर-विंडोज़ सिस्टम पर अच्छा काम नहीं करेगा। h2 jdbc कनेक्शन स्ट्रिंग्स के बारे में अधिक जानकारी के लिए h2 मैनुअल में कनेक्शन सेटिंग्स ।
H2 सिस्टम इस तरह काम करता है कि यदि डेटाबेस फ़ाइल पहले से मौजूद है, तो उसका पुन:उपयोग किया जाता है, अन्यथा एक नई डेटाबेस फ़ाइल बनाई जाती है। यदि आप डेटाबेस को संशोधित करते हैं, एप्लिकेशन को बंद कर देते हैं, फिर एक सप्ताह बाद फिर से एप्लिकेशन लोड करते हैं, तो यह सप्ताह पहले बनाए गए डेटा को पढ़ने में सक्षम होता है।