JavaFX MySQL连接示例请

Posted

技术标签:

【中文标题】JavaFX MySQL连接示例请【英文标题】:JavaFX MySQL connection example please 【发布时间】:2014-10-28 09:16:17 【问题描述】:

谁能给我一个将 JavaFX 与 mysql 连接的类的示例,不想要 Main 类,有一个,只想要一个将任何应用程序连接到 MySQL 数据库并从该数据库中获取一行的类示例表,搜索了整个互联网,我没有找到任何直截了当的东西,我不想要任何花哨的东西来完成工作。 干净简单的东西。

【问题讨论】:

你不应该对一个类这样做:在一个地方混合这些不同的功能(一方面是数据库连接,另一方面是 UI)是非常糟糕的做法。将其分成不同的组件。 @James_D 我并没有说要用一个类来做我想要一个简单的干净和清晰的类的示例,该类将我的 javaFX 项目连接到 MySQL 数据库以及如何使用的示例将数据库中的数据获取到表中。我在 google、youtube、facebook 或 *** 等上没有看到类似的东西 嗯,有数百个在TableView 中显示数据的示例,以及数百个从数据库中检索数据的示例。我会把一些东西放在一起,但我不确定其他地方不存在什么。 【参考方案1】:

至少,您需要三个类:一个代表您的数据,一个用于您的 UI,另一个用于管理数据库连接。当然,在真正的应用程序中,您需要的远不止这些。此示例遵循与TableView tutorial 相同的基本示例

假设您的数据库有一个包含三列 first_namelast_nameemail_addressperson 表。

然后你会写一个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);
    

(我只是在没有测试的情况下输入了它,因此可能存在拼写错误、缺少导入等,但应该足以让您了解。)

【讨论】:

很棒的答案。谢谢!【参考方案2】:

除了James_D的回答:

我想连接到远程(MySQL)数据库,所以我更改了构造函数并通过 url-only 连接:

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。

【讨论】:

以上是关于JavaFX MySQL连接示例请的主要内容,如果未能解决你的问题,请参考以下文章

JavaJava连接Mysql数据库的demo示例

我的可执行 JavaFX 文件如何连接到 MySQL 数据库?

mysql laravel 可以外连接还是全连接?

php连接mysql示例

java 连接mysql 示例

php连接mysql示例