Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

conexão javafx com mysql


Você pode acessar o MySQL a partir do JavaFX. Mas o JavaFX é executado em um cliente e algo como php geralmente é executado em um servidor. Você precisará de uma conexão do seu aplicativo java para o MySQL. Como seu provedor de hospedagem não permitirá que você se conecte diretamente à porta do banco de dados do seu aplicativo cliente Java, você precisará de outra maneira de se conectar.

Você pode fazer um túnel através da porta 80, pode executar um servlet (ou código de servidor php, etc) para interceptar o tráfego de entrada e chamadas de banco de dados proxy por meio de uma interface REST baseada em HTTP ou pode instalar o banco de dados localmente no cliente.

Eu vou assumir que, para um projeto escolar, não há problema em cada máquina cliente ter seu próprio banco de dados. Nesse caso, em vez de usar o MySQL, use um banco de dados Java leve como H2 , agrupe-o com seu aplicativo incluindo seu jar como uma biblioteca dependente, pacote o aplicativo mais DB jar como um aplicativo WebStart assinado usando as ferramentas de empacotamento JavaFX e hospedar os arquivos gerados pelas ferramentas de empacotamento em seu provedor de hospedagem.

Atualizar

Aqui está um aplicativo de exemplo que usa um banco de dados H2 local no computador cliente.
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;
  }
}

Existe um projeto NetBeans correspondente para esta amostra que gerará um aplicativo implementável. O projeto pode ser testado em webstart e applet modo.

Para o exemplo, o banco de dados é armazenado no computador do usuário (não no servidor do qual o aplicativo foi baixado) e persiste entre as execuções do aplicativo.

A localização exata depende da string de inicialização da conexão jdbc. No caso do meu exemplo o banco de dados vai no diretório do usuário jdbc:h2:~/test , que é específico do SO e do usuário. No caso de mim para Windows, acaba em C:\Users\john_smith\test.h2.db . Usando uma string de conexão jdbc como jdbc:h2:~/test é preferível a uma string como jdbc:h2:C:\\Baza porque uma string com C:\\ nele é específico da plataforma e não funcionará bem em sistemas que não sejam Windows. Para obter mais informações sobre cadeias de conexão jdbc h2, consulte as configurações de conexões no manual h2 .

O sistema h2 funciona de forma que se o arquivo de banco de dados já existir, ele é reutilizado, caso contrário, um novo arquivo de banco de dados é criado. Se você modificar o banco de dados, encerrar o aplicativo e carregá-lo novamente uma semana depois, ele poderá ler os dados criados na semana anterior.