sql >> Database >  >> RDS >> Mysql

javafx verbinding met mysql

U hebt toegang tot MySQL vanuit JavaFX. Maar JavaFX draait op een client en zoiets als php draait meestal op een server. Je hebt een verbinding nodig van je java-app naar MySQL. Aangezien uw hostingprovider u niet toestaat om rechtstreeks verbinding te maken met de databasepoort vanuit uw Java Client-app, heeft u een andere manier nodig om verbinding te maken.

Je zou door poort 80 kunnen tunnelen, je zou een servlet (of php-servercode, enz.) kunnen uitvoeren om inkomend verkeer en proxy-databaseoproepen te onderscheppen via een op HTTP gebaseerde REST-interface of je zou de DB lokaal op de client kunnen installeren.

Ik ga ervan uit dat het voor een schoolproject oké is dat elke clientcomputer zijn eigen database heeft. Gebruik in dat geval in plaats van MySQL een lichtgewicht Java-database zoals H2 , bundel het met uw app door de jar op te nemen als een afhankelijke bibliotheek, pakket de app plus DB jar als een ondertekende WebStart-toepassing met behulp van de JavaFX-verpakkingstools en host de bestanden die door de verpakkingstools worden gegenereerd bij uw hostingprovider.

Bijwerken

Hier is een voorbeeldtoepassing die een lokale H2-database op de clientcomputer gebruikt.

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

Er is een overeenkomend NetBeans-project voor dit voorbeeld dat een inzetbare toepassing zal genereren. Het project kan worden getest in webstart en applet modus.

Voor het voorbeeld wordt de database opgeslagen op de computer van de gebruiker (niet de server waarvan de toepassing is gedownload) en blijft deze bestaan ​​tussen de uitvoeringen van de toepassing.

De exacte locatie hangt af van de jdbc-verbindingsinitialisatiereeks. In het geval van mijn voorbeeld gaat de database in de gebruikersmap jdbc:h2:~/test , dat specifiek is voor het besturingssysteem en de gebruiker. In het geval van mij voor Windows komt het terecht op C:\Users\john_smith\test.h2.db . Een jdbc-verbindingsreeks gebruiken, zoals jdbc:h2:~/test heeft de voorkeur boven een string zoals jdbc:h2:C:\\Baza omdat een string met C:\\ daarin is platformspecifiek en werkt niet goed op niet-windows-systemen. Raadpleeg voor meer informatie over h2 jdbc-verbindingsreeksen de verbindingsinstellingen in de h2-handleiding .

Het h2-systeem werkt zo dat als het databasebestand al bestaat, het opnieuw wordt gebruikt, anders wordt er een nieuw databasebestand gemaakt. Als u de database wijzigt, de toepassing afsluit en de toepassing een week later opnieuw laadt, kan deze de gegevens lezen die de week ervoor zijn gemaakt.




  1. Geautomatiseerd testen van PostgreSQL-back-ups

  2. SQL Server 2005 Hoe creëer je een unieke beperking?

  3. Hoe de REGEX_REPLACE()-functie werkt in MySQL

  4. TreeView ImageCombo Vervolgkeuzelijst Toegangsmenu