在现代桌面应用开发中,将用户界面(UI)与后端数据存储相结合是至关重要的一环,JavaFX作为构建富客户端应用的首选框架,其本身并不直接处理数据库连接,而是依赖于Java强大的数据库连接能力,即JDBC(Java Database Connectivity),实现JavaFX与数据库的连接,核心在于将UI逻辑与数据访问逻辑清晰地分离开来,从而构建出结构清晰、易于维护的应用程序。

准备工作
在开始编码之前,请确保您的开发环境已配置妥当,您需要:
- JDK (Java Development Kit): JavaFX 11及更高版本需要单独的JDK。
 - IDE (Integrated Development Environment): 如IntelliJ IDEA或Eclipse,它们对Maven/Gradle和JavaFX提供了良好支持。
 - 数据库: 本示例将使用广泛使用的MySQL数据库,您也可以选择其他数据库,如PostgreSQL、SQLite等。
 - JDBC驱动: 这是Java程序与特定数据库通信的桥梁,对于MySQL,我们需要
mysql-connector-java。 
下表小编总结了核心技术栈:
| 技术栈 | 作用 | 示例 | 
|---|---|---|
| JavaFX | 构建用户界面 | Stage, Scene, TableView, Button | 
| JDBC | Java数据库连接API | Connection, Statement, ResultSet | 
| MySQL Driver | MySQL数据库的JDBC实现 | mysql-connector-j-8.x.x.jar | 
| Maven/Gradle | 项目构建与依赖管理 | pom.xml 或 build.gradle | 
第一步:添加JDBC驱动依赖
使用Maven管理项目依赖是现代Java开发的标准实践,在您的pom.xml文件中,添加MySQL JDBC驱动的依赖项。
<dependencies>
    <!-- JavaFX 依赖 -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>21</version>
    </dependency>
    <!-- MySQL JDBC 驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>
Maven会自动下载并管理这个驱动,使其在您的项目中可用。
第二步:创建数据库连接工具类
为了避免在代码中重复编写连接逻辑,最佳实践是创建一个专门的工具类来管理数据库连接,这个类通常负责加载驱动、提供获取连接的方法以及关闭连接。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
    // 数据库连接信息(实际项目中应从配置文件读取)
    private static final String URL = "jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC";
    private static final String USER = "your_username";
    private static final String PASSWORD = "your_password";
    // 获取数据库连接
    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            // 更好的做法是使用日志框架记录错误
            throw new RuntimeException("无法连接到数据库!", e);
        }
    }
}
注意:请将your_database_name、your_username和your_password替换为您自己的数据库信息,在生产环境中,这些敏感信息绝不应硬编码在源代码中,而应通过外部配置文件进行管理。

第三步:实现数据访问层(DAO)
数据访问对象(DAO)模式是将数据访问逻辑与业务逻辑分离的经典设计模式,我们创建一个UserDAO类,专门处理与users表相关的所有数据库操作。
定义一个与数据库表结构对应的Java实体类(POJO):
public class User {
    private int id;
    private String name;
    private String email;
    // 构造函数、Getters和Setters
    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
    // ... 省略getter和setter ...
}
创建UserDAO类,实现一个查询所有用户的方法:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDAO {
    public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();
        String sql = "SELECT id, name, email FROM users";
        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                users.add(new User(id, name, email));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return users;
    }
}
这里使用了try-with-resources语句,它可以自动关闭Connection、PreparedStatement和ResultSet,是处理JDBC资源的推荐方式。
第四步:在JavaFX控制器中集成数据
最后一步是在JavaFX的控制器中调用DAO层,获取数据并将其展示在UI组件上,例如TableView。
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableView;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
public class UserController implements Initializable {
    @FXML
    private TableView<User> userTable;
    private UserDAO userDAO;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        userDAO = new UserDAO();
        // 从数据库加载数据
        List<User> userList = userDAO.getAllUsers();
        // 将List转换为ObservableList,以便UI能自动响应数据变化
        ObservableList<User> observableUserList = FXCollections.observableArrayList(userList);
        // 将数据设置到TableView
        userTable.setItems(observableUserList);
        // 此处还需要设置TableView的列,将它们与User对象的属性绑定
        // nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
    }
}
通过这种方式,当控制器初始化时,它会自动从数据库查询所有用户数据,并将其填充到表格中,UI层(UserController)只负责展示,数据如何获取完全由UserDAO负责,实现了清晰的职责分离。

相关问答 (FAQs)
问题1:为什么推荐使用DAO模式,而不是直接在JavaFX控制器的事件处理器(如按钮点击)中写数据库代码?
解答:推荐使用DAO模式主要是为了实现“关注点分离”,直接在控制器中编写数据库代码会导致UI逻辑与数据访问逻辑高度耦合,带来以下问题:
- 可维护性差:如果数据库结构或连接方式改变,需要修改所有包含数据库代码的控制器。
 - 可重用性低:数据访问逻辑被锁定在特定的UI场景中,无法在其他地方复用。
 - 难以测试:无法独立测试数据访问逻辑,必须依赖UI环境。 DAO模式将数据访问封装在独立的类中,使得代码结构更清晰,更易于维护、复用和单元测试。
 
问题2:除了原生JDBC,还有没有更高级、更便捷的数据库操作方式?
解答:是的,原生JDBC虽然功能强大,但代码较为繁琐,需要手动管理资源和对象映射,在更复杂的项目中,开发者通常会使用ORM(Object-Relational Mapping)框架,如JPA(Java Persistence API)和它的主流实现Hibernate,ORM框架允许您以操作Java对象的方式来操作数据库记录,框架会自动处理SQL语句的生成和执行,极大地减少了样板代码,提高了开发效率,并使代码更加面向对象。