sql >> データベース >  >> RDS >> Mysql

mysqlへのjavafx接続

    JavaFXからMySQLにアクセスできます。ただし、JavaFXはクライアントで実行され、phpのようなものは通常サーバーで実行されます。 JavaアプリからMySQLへの接続が必要になります。ホスティングプロバイダーでは、Javaクライアントアプリからデータベースポートに直接接続することは許可されていないため、他の方法で接続する必要があります。

    ポート80を介してトンネリングしたり、サーブレット(またはphpサーバーコードなど)を実行して、HTTPベースのRESTインターフェースを介して着信トラフィックとプロキシデータベース呼び出しをインターセプトしたり、クライアントにローカルにDBをインストールしたりできます。

    学校のプロジェクトでは、各クライアントマシンが独自のデータベースを持っていても問題ないと仮定します。この場合、MySQLを使用する代わりに、H2 のような軽量のJavaデータベースを使用してください。 、jarを依存ライブラリとして含めることにより、アプリにバンドルします。 package アプリとDBjarを、JavaFXパッケージツールを使用して署名されたWebStartアプリケーションとして使用し、ホスティングプロバイダーでパッケージツールによって生成されたファイルをホストします。

    更新

    これは、クライアントコンピューターでローカルH2データベースを使用するサンプルアプリケーションです。

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

    対応するNetBeansプロジェクト があります このサンプルでは、​​デプロイ可能なアプリケーションが生成されます。プロジェクトは、webstart でテストできます。 およびアプレット モード。

    サンプルの場合、データベースはユーザーのコンピューター(アプリケーションのダウンロード元のサーバーではない)に保存され、アプリケーションの実行間で保持されます。

    正確な場所は、jdbc接続の初期化文字列によって異なります。私のサンプルの場合、データベースはユーザーのディレクトリjdbc:h2:~/testにあります。 、これはOSおよびユーザー固有です。私の場合、Windowsの場合はC:\Users\john_smith\test.h2.dbになります。 。 jdbc:h2:~/testなどのjdbc接続文字列を使用する jdbc:h2:C:\\Bazaなどの文字列よりも望ましい C:\\の文字列であるため その中でプラットフォーム固有であり、Windows以外のシステムではうまく機能しません。 h2 jdbc接続文字列の詳細については、h2マニュアルの接続設定

    h2システムは、データベースファイルがすでに存在する場合は再利用され、そうでない場合は新しいデータベースファイルが作成されるように機能します。データベースを変更し、アプリケーションをシャットダウンしてから、1週間後にアプリケーションを再度ロードすると、前の週に作成されたデータを読み取ることができます。




    1. SQL Server一括挿入–パート1

    2. UNIQUE制約とINSERT前のチェック

    3. MySQLで月ごとにグループ化する方法

    4. WampServer-MSVCR120.dllが見つからないため、mysqld.exeを起動できません