当前位置:首页 > 问答 > 正文

Java里用Swing界面怎么搞数据库连接,步骤和注意点分享

Swing只负责界面的显示和用户交互,它本身和数据库没有直接关系,数据库连接是靠Java专门的一套叫JDBC的API来完成的,我们的任务就是把这两者结合起来,让用户在界面上点个按钮,Swing就去调用JDBC的方法,然后把从数据库查出来的数据展示在界面上。(来源:Java SE官方文档关于Swing和JDBC的基本定义)

下面我分步骤来说,并穿插着需要注意的地方。

第一步:准备数据库和JDBC驱动

在你写任何Swing代码之前,先要把数据库这边的事情搞定。

  1. 有个数据库:比如你用MySQL、PostgreSQL或者SQLite都行,确保数据库服务是启动的,并且你知道怎么连上去(地址、端口、数据库名、用户名、密码)。
  2. 拿到JDBC驱动JAR包:不同的数据库需要不同的“翻译官”,这个“翻译官”就是一个JAR文件,比如用MySQL,就去MySQL官网下载一个叫mysql-connector-java的JAR包,用SQLite就去下载sqlite-jdbc的JAR包。
  3. 把JAR包引入你的项目:这是非常关键的一步,你不能光把JAR包下载到电脑里就完事了,你需要告诉你的Java项目:“喂,我有个重要的东西在这里,你编译和运行的时候要把它带上。” 在IDE里(比如Eclipse或IntelliJ IDEA),通常是在项目上右键,找到“Build Path”或“Libraries”,然后把那个JAR包添加进去,如果你是用命令行编译,就需要在编译和运行的时候用-cp参数指定这个JAR包的路径。(来源:各种数据库官方提供的JDBC驱动文档)

注意点:经常有新手在这一步卡住,程序一运行就报ClassNotFoundException,十有八九就是驱动JAR包没正确引入项目。

第二步:设计Swing界面

根据你的需求,用Swing的各种组件(JFrame, JButton, JTextField, JTable等)把界面画出来。

  • 一个查询界面:可能有几个输入框让用户输入查询条件,一个“查询”按钮,下面再来一个表格显示结果。
  • 一个数据录入界面:有几个输入框和“添加”按钮。

这部分就是纯粹的Swing编程,和数据库还没发生关系。

第三步:编写数据库连接和操作的核心代码

Java里用Swing界面怎么搞数据库连接,步骤和注意点分享

这部分代码是核心,但它应该独立于Swing界面,最好把它写在一个单独的类里,比如叫DBHelperUserDao,这样做的好处是,界面逻辑和数据访问逻辑分开了,以后要改数据库或者改界面都会容易很多。(来源:软件设计模式中的“分层架构”思想)

在这个类里,你主要要做这几件事:

  1. 定义连接信息:把数据库的地址、用户名、密码等写成常量。千万不要把这些敏感信息直接硬编码在代码里! 更好的做法是写在一个配置文件(比如.properties文件)里,程序运行时再去读,这样以后换数据库或者改密码就不用重新编译代码了。
  2. 获取数据库连接:写一个方法,用DriverManager.getConnection()方法来建立一个到数据库的连接。
  3. 执行SQL语句:根据你的需求,写方法来执行“增删改查”。
    • 查(Read):用PreparedStatement对象执行SELECT语句,然后用ResultSet对象来接收返回的结果。PreparedStatement可以防止SQL注入攻击,比Statement更安全。
    • 增删改(Create, Delete, Update):也是用PreparedStatement对象执行INSERT, DELETE, UPDATE语句,它会返回一个数字,表示影响了多少行数据,你可以根据这个判断操作是否成功。

注意点

  • 一定要关闭连接:数据库连接是非常宝贵的资源,用完了必须关闭,否则连接一直开着,很快就会把数据库拖垮,所以你的代码必须写成这样:
    // 伪代码示例
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
        conn = getConnection(); // 获取连接
        stmt = conn.prepareStatement(sql); // 准备语句
        rs = stmt.executeQuery(); // 执行查询
        // ... 处理结果
    } catch (SQLException e) {
        e.printStackTrace();
    } finally { // 无论上面是否出错,finally里的代码都会执行
        // 关闭顺序:后打开的先关闭 ResultSet -> Statement -> Connection
        try { if (rs != null) rs.close(); } catch (Exception e) {}
        try { if (stmt != null) stmt.close(); } catch (Exception e) {}
        try { if (conn != null) conn.close(); } catch (Exception e) {}
    }

    现在更推荐使用try-with-resources语法,它能自动关闭资源,更简洁安全。

  • 处理异常:数据库操作很容易出问题(网络断了、SQL写错了),所以一定要用try-catch捕获SQLException,并给用户一个友好的提示,而不是让程序直接崩溃。

第四步:把Swing界面和数据库代码连接起来

Java里用Swing界面怎么搞数据库连接,步骤和注意点分享

这是最后一步,也是最体现结合的地方,通常是在Swing界面里某个按钮的点击事件里(ActionListener),去调用你第三步写的那个DBHelper类的方法。

在“查询”按钮的监听器里:

  1. 从界面上的输入框里拿到用户输入的查询条件。
  2. 调用DBHelper.searchUsers(条件)方法。
  3. 这个方法会返回一个包含查询结果的列表(List)。
  4. 你把这个列表里的数据,填充到界面上的JTable表格中。

对于“添加”按钮,也是类似:

  1. 从输入框拿到用户输入的数据。
  2. 调用DBHelper.addUser(数据)方法。
  3. 根据返回结果,在界面上用JOptionPane.showMessageDialog弹出一个提示框,告诉用户“添加成功”或“失败”。

最重要的注意点:绝对不能在Swing的事件分发线程中执行耗时的数据库操作!

这是一个高级但至关重要的坑,Swing有一个单独的线程来负责处理用户的点击、刷新界面等所有事件,叫事件分发线程(EDT),如果你在这个线程里执行一个很慢的数据库查询,整个界面就会“卡死”,点什么都没反应,直到查询结束,用户体验极差。

正确的做法是使用多线程:当你点击“查询”按钮后,应该启动一个新的工作线程(Worker Thread)去执行数据库操作,等这个工作线程拿到数据后,再通知Swing的EDT线程去更新界面,Swing提供了SwingWorker这个类来帮你方便地做这件事。(来源:Oracle官方Java教程中“Concurrency in Swing”章节)

搞Swing连接数据库,其实就是“界面归界面,数据归数据”,然后用事件监听器把它们粘合起来,同时特别注意资源管理和线程问题,别看步骤不少,但每步分工明确,捋顺了就不难。