You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从MySQL获取特定课程时间数据到Java的JLabel组件

实现步骤详解

我来帮你一步步搞定这个需求,分几个核心环节来做:

1. 先搞定MySQL驱动依赖

首先得让Java能连接上MySQL,你需要引入MySQL的JDBC驱动。如果是用Maven管理项目,直接在pom.xml里加这段依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version> <!-- 用最新稳定版就行 -->
</dependency>

如果是普通Java项目,就去MySQL官网下载驱动jar包,然后手动导入到你的项目库中。

2. 封装数据库连接工具类

写一个工具类来管理数据库连接,避免重复代码,还能方便后续维护:

import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class DBUtil {
    private static MysqlDataSource dataSource;

    static {
        dataSource = new MysqlDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/你的数据库名?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8");
        dataSource.setUser("你的MySQL用户名");
        dataSource.setPassword("你的MySQL密码");
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

记得把上面的你的数据库名、用户名、密码换成你自己的实际信息,时区参数一定要加,不然可能会出现时间相关的报错。

3. 编写查询课程时间的方法

写一个专门的方法来从classes表中查询指定课程的时间:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ClassDao {
    // 根据课程名称查询上课时间
    public static String getClassTime(String className) {
        String sql = "SELECT `Class Time` FROM classes WHERE `Class Name` = ?";
        // 用try-with-resources自动关闭资源,不用手动写close
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, className);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return rs.getString("Class Time");
            }
        } catch (SQLException e) {
            e.printStackTrace(); // 实际项目里可以换成日志记录
        }
        return "未找到该课程"; // 查询不到时返回提示文本
    }
}

这里用PreparedStatement是为了防止SQL注入,比直接拼接字符串安全很多。另外因为你的列名带空格,SQL里要用反引号`把列名括起来,避免语法报错。

4. 在Swing界面中调用并更新UI

重点注意:Swing的UI更新必须在**事件调度线程(EDT)**里执行,而数据库查询是耗时操作,不能放在EDT里,不然界面会卡死。所以我们要把查询逻辑放到子线程,查询完成后再切回EDT更新JLabel。

假设你的界面类是这样的(左侧4个JLabel比如叫lblSwim、lblMath等,右侧对应lblSwimTime、lblMathTime):

import javax.swing.*;
import java.awt.*;

public class ClassScheduleFrame extends JFrame {
    private JLabel lblSwim;
    private JLabel lblSwimTime;

    public ClassScheduleFrame() {
        initUI();
        // 初始化时就查询并显示游泳课的时间
        loadClassTime("游泳课", lblSwimTime);
        // 如果要加载其他课程,直接调用这个方法就行,比如:
        // loadClassTime("数学课", lblMathTime);
    }

    private void initUI() {
        setTitle("课程时间表");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(4, 2, 10, 10));
        setLocationRelativeTo(null);

        // 左侧课程名称标签(手动填写的部分)
        lblSwim = new JLabel("游泳课");
        JLabel lblMath = new JLabel("数学课");
        JLabel lblEnglish = new JLabel("英语课");
        JLabel lblArt = new JLabel("美术课");

        // 右侧时间标签(初始为空)
        lblSwimTime = new JLabel("");
        JLabel lblMathTime = new JLabel("");
        JLabel lblEnglishTime = new JLabel("");
        JLabel lblArtTime = new JLabel("");

        // 添加到界面
        add(lblSwim);
        add(lblSwimTime);
        add(lblMath);
        add(lblMathTime);
        add(lblEnglish);
        add(lblEnglishTime);
        add(lblArt);
        add(lblArtTime);
    }

    // 封装加载课程时间的方法
    private void loadClassTime(String className, JLabel targetLabel) {
        // 开启子线程执行数据库查询
        new Thread(() -> {
            String classTime = ClassDao.getClassTime(className);
            // 切回EDT更新UI
            SwingUtilities.invokeLater(() -> {
                targetLabel.setText(classTime);
            });
        }).start();
    }

    public static void main(String[] args) {
        // 在EDT中启动界面,符合Swing规范
        SwingUtilities.invokeLater(() -> {
            new ClassScheduleFrame().setVisible(true);
        });
    }
}

这样运行起来,游泳课的时间就会自动加载到右侧对应的JLabel里了。如果要加载其他课程,只需要调用loadClassTime("课程名称", 对应右侧标签)就行。

一些额外注意事项

  • 异常处理优化:上面的代码里只是打印了异常,实际项目中可以换成弹出JOptionPane提示用户“数据库连接失败”之类的信息,更友好。
  • 资源安全:用try-with-resources可以自动关闭Connection、PreparedStatement这些资源,避免内存泄漏。
  • 空值处理:如果数据库里某课程没有对应的时间,代码会返回“未找到该课程”,你可以根据需求改成空字符串或者其他提示。

内容的提问来源于stack exchange,提问作者Waad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:19:48