Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can access MySQL from JavaFX. But JavaFX runs on a client and something like php usually runs on a server. You will need a connection from your java app to MySQL. As your hosting provider won't allow you to directly connect to the database port from your Java Client App, you will need some other way to connect. </p> <p>You could tunnel through port 80, you could run a servlet (or php server code, etc) to intercept incoming traffic and proxy database calls through a HTTP based REST interface or you could install the DB locally on the client.</p> <p>I'm going to assume, for a school project, it's ok for each client machine to have it's own database. In which case, instead of using MySQL, use a lightweight Java database like <a href="http://www.h2database.com/html/main.html" rel="nofollow">H2</a>, bundle it with your app by including it's jar as a dependent library, <a href="http://docs.oracle.com/javafx/2/deployment/packaging.htm" rel="nofollow">package</a> the app plus DB jar as a signed WebStart application using the JavaFX packaging tools and host the files generated by the packaging tools at your hosting provider.</p> <p><strong>Update</strong></p> <p>Here is a sample application which uses a local H2 database on the client computer.</p> <pre><code>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&lt;String&gt; nameView = new ListView(); final Button fetchNames = new Button("Fetch names from the database"); fetchNames.setOnAction(new EventHandler&lt;ActionEvent&gt;() { @Override public void handle(ActionEvent event) { fetchNamesFromDatabaseToListView(nameView); } }); final Button clearNameList = new Button("Clear the name list"); clearNameList.setOnAction(new EventHandler&lt;ActionEvent&gt;() { @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&lt;String&gt; fetchNames(Connection con) throws SQLException { logger.info("Fetching names from database"); ObservableList&lt;String&gt; 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; } } </code></pre> <p>There is a <a href="https://s3.amazonaws.com/baanthaispa/h2app.zip" rel="nofollow">corresponding NetBeans project</a> for this sample which will generate a deployable application. The project can be tested in <a href="https://s3.amazonaws.com/baanthaispa/h2app/webstart.html" rel="nofollow">webstart</a> and <a href="https://s3.amazonaws.com/baanthaispa/h2app/applet.html" rel="nofollow">applet</a> mode.</p> <p>For the sample, the database is stored on the user's computer (not the server from which the application was downloaded) and persists between application runs. </p> <p>The exact location depends on the jdbc connection initialization string. In the case of my sample the database goes in the user's directory <code>jdbc:h2:~/test</code>, which is OS and User specific. In the case of me for Windows it ends up at <code>C:\Users\john_smith\test.h2.db</code>. Using a jdbc connection string such as <code>jdbc:h2:~/test</code> is preferable to a string such as <code>jdbc:h2:C:\\Baza</code> because a string with <code>C:\\</code> in it is platform specific and won't work well on non-windows systems. For further information on h2 jdbc connection strings refer to the <a href="http://www.h2database.com/html/features.html#embedded_databases" rel="nofollow">connections settings in the h2 manual</a>.</p> <p>The h2 system works such that if the database file already exists, it is reused, otherwise a new database file is created. If you modify the database, shut the application down, then load the application again a week later, it is able to read the data created the week before. </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload