Mysql
 sql >> Datenbank >  >> RDS >> Mysql

javafx-Verbindung zu mysql

Sie können von JavaFX aus auf MySQL zugreifen. Aber JavaFX läuft auf einem Client und so etwas wie PHP läuft normalerweise auf einem Server. Sie benötigen eine Verbindung von Ihrer Java-App zu MySQL. Da Ihr Hosting-Provider Ihnen keine direkte Verbindung zum Datenbankport von Ihrer Java-Client-App erlaubt, müssen Sie sich auf andere Weise verbinden.

Sie könnten durch Port 80 tunneln, Sie könnten ein Servlet (oder PHP-Servercode usw.) ausführen, um eingehenden Datenverkehr und Proxy-Datenbankaufrufe über eine HTTP-basierte REST-Schnittstelle abzufangen, oder Sie könnten die DB lokal auf dem Client installieren.

Ich gehe davon aus, dass es für ein Schulprojekt in Ordnung ist, wenn jeder Client-Computer seine eigene Datenbank hat. Verwenden Sie in diesem Fall anstelle von MySQL eine leichtgewichtige Java-Datenbank wie H2 , bündeln Sie es mit Ihrer App, indem Sie seine JAR-Datei als abhängige Bibliothek hinzufügen, package die App plus DB-JAR als signierte WebStart-Anwendung mit den JavaFX-Paketierungstools und hosten Sie die von den Paketierungstools generierten Dateien bei Ihrem Hosting-Provider.

Aktualisieren

Hier ist eine Beispielanwendung, die eine lokale H2-Datenbank auf dem Client-Computer verwendet.

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

Es gibt ein entsprechendes NetBeans-Projekt für dieses Beispiel, das eine bereitstellbare Anwendung generiert. Das Projekt kann in webstart getestet werden und Applet Modus.

Für das Beispiel wird die Datenbank auf dem Computer des Benutzers gespeichert (nicht auf dem Server, von dem die Anwendung heruntergeladen wurde) und bleibt zwischen Anwendungsausführungen bestehen.

Der genaue Speicherort hängt von der jdbc-Verbindungsinitialisierungszeichenfolge ab. In meinem Beispiel kommt die Datenbank in das Benutzerverzeichnis jdbc:h2:~/test , die betriebssystem- und benutzerspezifisch ist. Bei mir für Windows landet es bei C:\Users\john_smith\test.h2.db . Verwenden einer jdbc-Verbindungszeichenfolge wie jdbc:h2:~/test ist einem String wie jdbc:h2:C:\\Baza vorzuziehen weil ein String mit C:\\ darin ist plattformspezifisch und funktioniert nicht gut auf Nicht-Windows-Systemen. Weitere Informationen zu h2-jdbc-Verbindungszeichenfolgen finden Sie in den Verbindungseinstellungen im h2-Handbuch .

Das h2-System arbeitet so, dass eine bereits vorhandene Datenbankdatei wiederverwendet wird, andernfalls wird eine neue Datenbankdatei erstellt. Wenn Sie die Datenbank ändern, die Anwendung beenden und die Anwendung eine Woche später erneut laden, kann sie die in der Woche zuvor erstellten Daten lesen.