Mysql
 sql >> Base de données >  >> RDS >> Mysql

connexion javafx à mysql

Vous pouvez accéder à MySQL à partir de JavaFX. Mais JavaFX s'exécute sur un client et quelque chose comme php s'exécute généralement sur un serveur. Vous aurez besoin d'une connexion de votre application Java à MySQL. Comme votre fournisseur d'hébergement ne vous autorisera pas à vous connecter directement au port de la base de données à partir de votre application client Java, vous aurez besoin d'un autre moyen de vous connecter.

Vous pouvez tunnel via le port 80, vous pouvez exécuter un servlet (ou un code de serveur php, etc.) pour intercepter le trafic entrant et les appels de base de données proxy via une interface REST basée sur HTTP ou vous pouvez installer la base de données localement sur le client.

Je vais supposer que, pour un projet scolaire, il est normal que chaque machine cliente ait sa propre base de données. Dans ce cas, au lieu d'utiliser MySQL, utilisez une base de données Java légère comme H2 , regroupez-le avec votre application en incluant son jar en tant que bibliothèque dépendante, package l'application plus DB jar en tant qu'application WebStart signée à l'aide des outils d'empaquetage JavaFX et hébergez les fichiers générés par les outils d'empaquetage chez votre fournisseur d'hébergement.

Mettre à jour

Voici un exemple d'application qui utilise une base de données H2 locale sur l'ordinateur client.

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

Il existe un projet NetBeans correspondant pour cet exemple qui générera une application déployable. Le projet peut être testé dans webstart et applet mode.

Pour l'exemple, la base de données est stockée sur l'ordinateur de l'utilisateur (et non sur le serveur à partir duquel l'application a été téléchargée) et persiste entre les exécutions de l'application.

L'emplacement exact dépend de la chaîne d'initialisation de la connexion jdbc. Dans le cas de mon exemple, la base de données va dans le répertoire de l'utilisateur jdbc:h2:~/test , qui est spécifique au système d'exploitation et à l'utilisateur. Dans le cas de moi pour Windows, il se termine par C:\Users\john_smith\test.h2.db . Utilisation d'une chaîne de connexion jdbc telle que jdbc:h2:~/test est préférable à une chaîne telle que jdbc:h2:C:\\Baza car une chaîne avec C:\\ il est spécifique à la plate-forme et ne fonctionnera pas bien sur les systèmes autres que Windows. Pour plus d'informations sur les chaînes de connexion h2 jdbc, reportez-vous aux paramètres de connexion dans le manuel h2 .

Le système h2 fonctionne de telle sorte que si le fichier de base de données existe déjà, il est réutilisé, sinon un nouveau fichier de base de données est créé. Si vous modifiez la base de données, arrêtez l'application, puis rechargez l'application une semaine plus tard, elle est capable de lire les données créées la semaine précédente.