Mysql
 sql >> Baza danych >  >> RDS >> Mysql

połączenie javafx z mysql

Dostęp do MySQL można uzyskać z JavaFX. Ale JavaFX działa na kliencie, a coś takiego jak php zwykle działa na serwerze. Będziesz potrzebować połączenia aplikacji Java z MySQL. Ponieważ dostawca usług hostingowych nie pozwala na bezpośrednie łączenie się z portem bazy danych z aplikacji klienta Java, będziesz potrzebować innego sposobu połączenia.

Możesz tunelować przez port 80, możesz uruchomić serwlet (lub kod serwera php, itp.), aby przechwycić ruch przychodzący i wywołania bazy danych proxy przez interfejs REST oparty na HTTP lub możesz zainstalować bazę danych lokalnie na kliencie.

Zakładam, że w przypadku projektu szkolnego każda maszyna kliencka może mieć własną bazę danych. W takim przypadku zamiast używać MySQL, użyj lekkiej bazy danych Java, takiej jak H2 , dołącz go do swojej aplikacji, dołączając jego plik jar jako bibliotekę zależną, pakiet aplikacja plus DB jar jako podpisana aplikacja WebStart przy użyciu narzędzi do pakowania JavaFX i hostuj pliki generowane przez narzędzia do pakowania u dostawcy hostingu.

Aktualizacja

Oto przykładowa aplikacja, która korzysta z lokalnej bazy danych H2 na komputerze klienckim.

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

Istnieje odpowiedni projekt NetBeans dla tego przykładu, który wygeneruje aplikację do wdrożenia. Projekt można przetestować w webstart i aplet tryb.

W przypadku przykładu baza danych jest przechowywana na komputerze użytkownika (nie na serwerze, z którego aplikacja została pobrana) i jest zachowywana pomiędzy uruchomieniami aplikacji.

Dokładna lokalizacja zależy od ciągu inicjowania połączenia jdbc. W przypadku mojego przykładu baza danych trafia do katalogu użytkownika jdbc:h2:~/test , który jest specyficzny dla systemu operacyjnego i użytkownika. W przypadku mnie dla Windows kończy się w C:\Users\john_smith\test.h2.db . Korzystanie z ciągu połączenia jdbc, takiego jak jdbc:h2:~/test jest lepszy niż ciąg, taki jak jdbc:h2:C:\\Baza ponieważ ciąg z C:\\ w tym jest specyficzna dla platformy i nie będzie działać dobrze w systemach innych niż Windows. Więcej informacji na temat parametrów połączenia h2 jdbc można znaleźć w ustawieniach połączeń w podręczniku h2 .

System h2 działa w taki sposób, że jeśli plik bazy danych już istnieje, jest ponownie używany, w przeciwnym razie tworzony jest nowy plik bazy danych. Jeśli zmodyfikujesz bazę danych, zamknij aplikację, a następnie załaduj ją ponownie tydzień później, będzie mogła odczytać dane utworzone tydzień wcześniej.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dziwne kodowanie znaków przechowywanych danych, stary skrypt pokazuje je dobrze, nowy nie

  2. Neo4j - Usuń węzeł za pomocą Cypher

  3. Błąd połączenia C# MySQL SSL podczas próby użycia conn.Open()

  4. Policz wystąpienia podciągu w kolumnie MySQL

  5. Jak wyłączyć pamięć podręczną zapytań za pomocą mysql.connector?