2014-09-03 53 views
7

任何人都可以給我一個連接JavaFX和MySQL的類的例子,不需要Main類,只有一個,只是想要一個將任何應用程序連接到MySQL數據庫並獲得一行的類的示例從那個數據庫到一張桌子,搜索整個互聯網,我沒有找到任何直接的事情,我不想要任何花哨的東西,請完成工作。 乾淨簡單的東西。JavaFX MySQL連接示例請問

+0

你不應該這樣做一個類:在一個地方混合這些不同的功能塊(一方面是數據庫連接,另一方面是UI)是非常糟糕的做法。將其分爲不同的組件。 – 2014-09-03 20:09:15

+0

@James_D我沒有說過要用一個類來完成它,我想要一個很好的簡單幹淨清晰的例子,將javaFX項目連接到MySQL數據庫以及如何從數據庫獲取數據的示例放入桌子。我還沒有看到任何類似的東西在谷歌或YouTube或Facebook或stackoverflow等 – marcS 2014-09-03 20:17:54

+0

那麼,有數百個在'TableView'中顯示數據的例子,以及數百個從數據庫中檢索數據的例子。我會把一些東西放在一起,但我不確定其他地方不存在什麼。 – 2014-09-03 20:21:57

回答

16

至少需要三個類:一個用於表示數據,一個用於UI,另一個用於管理數據庫連接。當然,在真實應用中,您需要的不僅僅是這些。本示例遵循相同的基本例子作爲TableView tutorial

假設你的數據庫有一個person表有三列,first_namelast_nameemail_address

然後你會寫Person類:

import javafx.beans.property.StringProperty ; 
import javafx.beans.property.SimpleStringProperty ; 

public class Person { 
    private final StringProperty firstName = new SimpleStringProperty(this, "firstName"); 
    public StringProperty firstNameProperty() { 
     return firstName ; 
    } 
    public final String getFirstName() { 
     return firstNameProperty().get(); 
    } 
    public final void setFirstName(String firstName) { 
     firstNameProperty().set(firstName); 
    } 

    private final StringProperty lastName = new SimpleStringProperty(this, "lastName"); 
    public StringProperty lastNameProperty() { 
     return lastName ; 
    } 
    public final String getLastName() { 
     return lastNameProperty().get(); 
    } 
    public final void setLastName(String lastName) { 
     lastNameProperty().set(lastName); 
    } 

    private final StringProperty email = new SimpleStringProperty(this, "email"); 
    public StringProperty emailProperty() { 
     return email ; 
    } 
    public final String getEmail() { 
     return emailProperty().get(); 
    } 
    public final void setEmail(String email) { 
     emailProperty().set(email); 
    } 

    public Person() {} 

    public Person(String firstName, String lastName, String email) { 
     setFirstName(firstName); 
     setLastName(lastName); 
     setEmail(email); 
    } 

} 

一個類來訪問數據庫中的數據:

import java.sql.Connection ; 
import java.sql.DriverManager ; 
import java.sql.SQLException ; 
import java.sql.Statement ; 
import java.sql.ResultSet ; 

import java.util.List ; 
import java.util.ArrayList ; 

public class PersonDataAccessor { 

    // in real life, use a connection pool.... 
    private Connection connection ; 

    public PersonDataAccessor(String driverClassName, String dbURL, String user, String password) throws SQLException, ClassNotFoundException { 
     Class.forName(driverClassName); 
     connection = DriverManager.getConnection(dbURL, user, password); 
    } 

    public void shutdown() throws SQLException { 
     if (connection != null) { 
      connection.close(); 
     } 
    } 

    public List<Person> getPersonList() throws SQLException { 
     try (
      Statement stmnt = connection.createStatement(); 
      ResultSet rs = stmnt.executeQuery("select * from person"); 
     ){ 
      List<Person> personList = new ArrayList<>(); 
      while (rs.next()) { 
       String firstName = rs.getString("first_name"); 
       String lastName = rs.getString("last_name"); 
       String email = rs.getString("email_address"); 
       Person person = new Person(firstName, lastName, email); 
       personList.add(person); 
      } 
      return personList ; 
     } 
    } 

    // other methods, eg. addPerson(...) etc 
} 

然後一個UI類:

import javafx.application.Application ; 
import javafx.scene.control.TableView ; 
import javafx.scene.control.TableColumn ; 
import javafx.scene.control.cell.PropertyValueFactory ; 
import javafx.scene.layout.BorderPane ; 
import javafx.scene.Scene ; 
import javafx.stage.Stage ; 

public class PersonTableApp extends Application { 
    private PersonDataAccessor dataAccessor ; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     dataAccessor = new PersonDataAccessor(...); // provide driverName, dbURL, user, password... 

     TableView<Person> personTable = new TableView<>(); 
     TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name"); 
     firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName")); 
     TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name"); 
     lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName")); 
     TableColumn<Person, String> emailCol = new TableColumn<>("Email"); 
     emailCol.setCellValueFactory(new PropertyValueFactory<>("email")); 

     personTable.getColumns().addAll(firstNameCol, lastNameCol, emailCol); 

     personTable.getItems().addAll(dataAccessor.getPersonList()); 

     BorderPane root = new BorderPane(); 
     root.setCenter(personTable); 
     Scene scene = new Scene(root, 600, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void stop() throws Exception { 
     if (dataAccessor != null) { 
      dataAccessor.shutdown(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

(我只是在沒有測試的情況下輸入的,所以可能會出現拼寫錯誤,缺少導入等,但它顯示ULD足以給你的想法)

+0

非常感謝你 – marcS 2014-09-03 22:18:17

+0

真棒的答案。謝謝! – 2017-07-27 03:29:25

1

除了對James_D答案:

我想連接到遠程(MySQL的)數據庫,所以我改變了構造函數,只URL連接:

public UserAccessor(String dbURL, String user, String password) throws SQLException, ClassNotFoundException { 
    connection = DriverManager.getConnection(dbURL, user, password); 
} 

初始化通過:

UserAccessor userAccessor = new UserAccessor(
    "jdbc:mysql://xxx.xxx.xxx.xxx:YOUR_PORT", "YOUR_DB_USER", "YOUR_PASSWORD") 

請注意: 您還需要包括連接器庫。我選擇了mysql-connector-java-5.1.40-bin.jar,它隨IntelliJ提供並位於/Users/martin/Library/Preferences/IntelliJIdea2017.1/jdbc-drivers/MySQL Connector/J/5.1.40/mysql-connector-java-5.1.40-bin.jar

榮譽屬於James_D。