sql >> Databáze >  >> RDS >> Mysql

javafx připojení k mysql

K MySQL můžete přistupovat z JavaFX. Ale JavaFX běží na klientovi a něco jako php obvykle běží na serveru. Budete potřebovat připojení z vaší java aplikace k MySQL. Protože váš poskytovatel hostingu vám nedovolí připojit se přímo k databázovému portu z vaší aplikace Java Client, budete potřebovat jiný způsob připojení.

Můžete tunelovat přes port 80, můžete spustit servlet (nebo kód php serveru atd.) k zachycení příchozího provozu a volání proxy databáze prostřednictvím rozhraní REST založeného na HTTP nebo můžete nainstalovat DB lokálně na klienta.

Budu předpokládat, že pro školní projekt je v pořádku, aby každý klientský počítač měl svou vlastní databázi. V takovém případě místo použití MySQL použijte lehkou databázi Java, jako je H2 , spojte ji se svou aplikací tím, že zahrnete její jar jako závislou knihovnu, balík aplikaci plus DB jar jako podepsanou aplikaci WebStart využívající balicí nástroje JavaFX a hostování souborů generovaných balicími nástroji u vašeho poskytovatele hostingu.

Aktualizovat

Zde je ukázková aplikace, která používá místní databázi H2 na klientském počítači.

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

Existuje odpovídající projekt NetBeans pro tento příklad, který vygeneruje nasaditelnou aplikaci. Projekt lze otestovat na webstart a applet režimu.

Pro ukázku je databáze uložena v počítači uživatele (nikoli na serveru, ze kterého byla aplikace stažena) a přetrvává mezi spuštěními aplikace.

Přesné umístění závisí na inicializačním řetězci připojení jdbc. V případě mého vzorku se databáze nachází v adresáři uživatele jdbc:h2:~/test , což je specifické pro OS a uživatele. V případě mě pro Windows to končí na C:\Users\john_smith\test.h2.db . Pomocí připojovacího řetězce jdbc, jako je jdbc:h2:~/test je vhodnější než řetězec jako jdbc:h2:C:\\Baza protože řetězec s C:\\ je specifická pro platformu a nebude dobře fungovat na systémech bez systému Windows. Další informace o připojovacích řetězcích h2 jdbc naleznete v nastavení připojení v příručce h2 .

Systém h2 funguje tak, že pokud databázový soubor již existuje, je znovu použit, jinak je vytvořen nový databázový soubor. Pokud upravíte databázi, vypnete aplikaci a poté aplikaci znovu načtete o týden později, je schopna číst data vytvořená týden předtím.




  1. Jak najdu všechny tabulky v MySQL se specifickými názvy sloupců?

  2. Je možné předat název tabulky jako parametr v Oracle?

  3. Jak otestovat, zda je řetězec JSON nebo ne?

  4. mysql příkaz SELECT IF s NEBO