☰
Eclipse+Java Swing 桌面酒店管理系统:TaoToken 统一 Key 接入 MySQL 配置骨架
2026/9/27 18:52:50 网站建设 项目流程

1. 桌面酒店管理系统为什么总卡在数据库配置这一步

Eclipse 下用 Java Swing 写桌面酒店管理系统,是很多计算机专业课程设计和本地小型项目的主流选型。它不依赖浏览器,双击就能跑,前台开房、退房、房态查询这些操作响应快,适合酒店前台这种单机或局域网场景。但真正动手写的时候,大部分人卡住的地方不是 Swing 界面画不出来,而是 MySQL 连接配置和密钥管理这两件事。

我见过太多这样的项目:JdbcUtil里硬编码root/123456,换台电脑就报Access denied;或者把 API Key 直接写进.java文件,提交到 Git 之后被人扫到。更麻烦的是,当你想给系统加一个「智能问答」或者「房态预测」的小功能时,又要去申请一个新的模型 Key,散落在各个类里,改起来像拆炸弹。

这篇内容就聚焦一个具体目标:在 Eclipse 的 Java Swing 桌面酒店管理系统里,把 MySQL 连接配置和 TaoToken 统一 Key 接入做成一套可复制的骨架。你会拿到db.properties和settings.json两个配置文件的完整写法,知道怎么在 Swing 启动时加载它们,怎么验证连接成功,以及连接失败时按什么顺序排查。适合正在做课程设计、接私活、或者维护二手桌面项目的开发者。

TaoToken 在这里的角色是统一 Key 入口。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。它把模型调用收敛到一个 Key 上,桌面端只需要读一个配置项,不用在代码里到处塞不同厂商的密钥。下面从环境准备开始,一步步把骨架搭起来。

2. TaoToken 统一 Key 与项目前置准备

2.1 为什么桌面项目也需要统一 Key

桌面酒店管理系统看起来是本地程序,但它一旦要调用模型能力,比如自动生成入住登记摘要、根据历史数据推荐房价、或者做一个前台话术助手,就需要访问外部 API。如果每个功能都单独申请 Key,代码里会出现key1、key2、key3,维护成本高,还容易泄露。

TaoToken 的做法是提供一个统一的 API 入口,你只需要在控制台创建一个 Key,然后在settings.json里配置一次。Java 代码通过读取这个配置文件拿到 Key,再拼接到请求头里。这样换 Key、换模型、加功能,都只改一个地方。

2.2 在 Eclipse 里确认项目结构

打开你的 Eclipse 工作空间,找到酒店管理系统项目,确认目录结构大致如下:

HotelManager/ ├── src/ │ └── com/hotel/ │ ├── ui/ # Swing 窗体 │ ├── dao/ # 数据库访问 │ ├── util/ # 工具类 │ └── config/ # 配置加载 ├── lib/ # 第三方 jar ├── resources/ # 配置文件放这里 │ ├── db.properties │ └── settings.json └── bin/

如果resources目录不存在,右键项目 → New → Folder,命名为resources。这个目录会被加入 Build Path,运行时可以通过类加载器读取。

2.3 获取 TaoToken Key 的入口

访问控制台页面创建 API Key,地址是 https://taotoken.net/console 。创建完成后复制 Key,注意不要直接粘贴到聊天窗口或截图里。如果你后续要做长期编码或者 Agent 类功能,可以了解 Coding Plan,入口在 https://taotoken.net/coding-plan 。模型对话调试可以用 https://taotoken.net/models ,接入文档在 https://taotoken.net/doc ,API Keys 管理在 https://taotoken.net/api-keys 。

这些链接都带上了utm_source=taotoken_aicg_blog_end&utm_content=对应的内容标识和utm_campaign=rewrite,方便你从这篇内容直接跳转。

2.4 MySQL 侧的准备

确保本地 MySQL 服务已经启动,并且有一个专门给酒店系统用的数据库。执行下面的 SQL 创建库和基础表:

CREATE DATABASE hotel_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE hotel_db; CREATE TABLE room ( id INT PRIMARY KEY AUTO_INCREMENT, room_no VARCHAR(10) NOT NULL UNIQUE, room_type VARCHAR(20) NOT NULL, price DECIMAL(10,2) NOT NULL, status VARCHAR(10) DEFAULT '空闲' ); CREATE TABLE guest ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, id_card VARCHAR(20) NOT NULL, phone VARCHAR(20), check_in_time DATETIME, room_id INT );

创建一个专用账号,不要用 root 跑应用:

CREATE USER 'hotel_app'@'localhost' IDENTIFIED BY 'Hotel@2024'; GRANT ALL PRIVILEGES ON hotel_db.* TO 'hotel_app'@'localhost'; FLUSH PRIVILEGES;

这一步很重要。很多二手项目直接拿 root 连库,一旦部署到别人机器上,权限和密码都是问题。用专用账号,后面db.properties里填的也是这个。

3. 可复制的 db.properties 与 settings.json 骨架

3.1 db.properties 完整写法

在resources目录下新建db.properties,内容如下:

# MySQL 连接配置 jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/hotel_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true jdbc.username=hotel_app jdbc.password=Hotel@2024 # 连接池参数(用 HikariCP 时生效) jdbc.pool.maximumPoolSize=10 jdbc.pool.minimumIdle=2 jdbc.pool.connectionTimeout=30000 jdbc.pool.idleTimeout=600000

几个参数说明一下。serverTimezone=Asia/Shanghai不加的话,MySQL 8 驱动会报时区错误。useSSL=false在本地开发环境可以关掉,生产环境建议开启。allowPublicKeyRetrieval=true是 MySQL 8 默认认证方式下需要的,否则会报Public Key Retrieval is not allowed。

3.2 settings.json 完整写法

同样在resources目录下新建settings.json:

{ "taotoken": { "apiKey": "sk-你的TaoTokenKey", "baseUrl": "https://taotoken.net/api", "model": "claude-3-5-sonnet", "timeout": 30000 }, "app": { "name": "HotelManager", "version": "1.0.0", "debug": true }, "database": { "configFile": "db.properties" } }

注意baseUrl写的是https://taotoken.net/api,不要加 UTM 参数,API 调用地址保持干净。apiKey这里先填占位符,实际运行时从环境变量或者本地未提交的配置文件读取更安全。

3.3 配置加载工具类

在com.hotel.config包下新建ConfigLoader.java:

package com.hotel.config; import java.io.InputStream; import java.util.Properties; public class ConfigLoader { private static final Properties dbProps = new Properties(); private static String taotokenApiKey; private static String taotokenBaseUrl; static { try (InputStream dbIn = ConfigLoader.class.getClassLoader() .getResourceAsStream("db.properties")) { if (dbIn == null) { throw new RuntimeException("db.properties 未找到,请检查 resources 目录"); } dbProps.load(dbIn); } catch (Exception e) { throw new RuntimeException("加载 db.properties 失败", e); } } public static String getDb(String key) { return dbProps.getProperty(key); } public static String getTaotokenApiKey() { if (taotokenApiKey == null) { taotokenApiKey = System.getenv("TAOTOKEN_API_KEY"); if (taotokenApiKey == null || taotokenApiKey.isEmpty()) { taotokenApiKey = "sk-你的TaoTokenKey"; } } return taotokenApiKey; } public static String getTaotokenBaseUrl() { if (taotokenBaseUrl == null) { taotokenBaseUrl = "https://taotoken.net/api"; } return taotokenBaseUrl; } }

这里优先从环境变量TAOTOKEN_API_KEY读取,读不到再用占位符。这样本地调试方便,提交代码也不会泄露真实 Key。

3.4 数据库连接工具类

在com.hotel.util包下新建DBUtil.java:

package com.hotel.util; import com.hotel.config.ConfigLoader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER = ConfigLoader.getDb("jdbc.driver"); private static final String URL = ConfigLoader.getDb("jdbc.url"); private static final String USER = ConfigLoader.getDb("jdbc.username"); private static final String PASSWORD = ConfigLoader.getDb("jdbc.password"); static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new RuntimeException("MySQL 驱动未加载,请检查 lib 目录", e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(AutoCloseable... resources) { for (AutoCloseable r : resources) { if (r != null) { try { r.close(); } catch (Exception ignored) { } } } } }

这个类只做三件事:加载驱动、拿连接、关资源。不要在这里写业务逻辑,保持职责单一。

4. 启动验证与成功结果确认

4.1 写一个连接测试的 main 方法

在com.hotel包下新建StartupCheck.java:

package com.hotel; import com.hotel.config.ConfigLoader; import com.hotel.util.DBUtil; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class StartupCheck { public static void main(String[] args) { System.out.println("=== 酒店管理系统启动自检 ==="); // 1. 检查配置加载 System.out.println("DB URL: " + ConfigLoader.getDb("jdbc.url")); System.out.println("TaoToken BaseUrl: " + ConfigLoader.getTaotokenBaseUrl()); System.out.println("TaoToken Key 前缀: " + ConfigLoader.getTaotokenApiKey().substring(0, 6) + "..."); // 2. 检查数据库连接 try (Connection conn = DBUtil.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM room")) { if (rs.next()) { System.out.println("数据库连接成功,room 表记录数: " + rs.getInt(1)); } } catch (Exception e) { System.err.println("数据库连接失败: " + e.getMessage()); e.printStackTrace(); } System.out.println("=== 自检结束 ==="); } }

在 Eclipse 里右键这个文件 → Run As → Java Application。

4.2 预期输出

控制台应该输出类似下面的内容:

=== 酒店管理系统启动自检 === DB URL: jdbc:mysql://localhost:3306/hotel_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true TaoToken BaseUrl: https://taotoken.net/api TaoToken Key 前缀: sk-abc... 数据库连接成功,room 表记录数: 0 === 自检结束 ===

看到「数据库连接成功」就说明db.properties和DBUtil这条链路通了。room表记录数是 0 没关系,说明表建好了但还没插数据。

4.3 在 Swing 启动时调用自检

在MainFrame.java的main方法里,创建窗口之前先跑一次轻量检查:

public static void main(String[] args) { SwingUtilities.invokeLater(() -> { try { DBUtil.getConnection().close(); System.out.println("启动前数据库检查通过"); } catch (Exception e) { JOptionPane.showMessageDialog(null, "数据库连接失败,请检查 db.properties\n" + e.getMessage(), "启动错误", JOptionPane.ERROR_MESSAGE); return; } new MainFrame().setVisible(true); }); }

这样用户双击启动时,如果数据库没配好,会直接弹窗提示,而不是等点到某个功能才报错。

4.4 验证 TaoToken 请求链路

写一个最小的 HTTP 请求测试,确认 Key 和 baseUrl 能通。在com.hotel.util下新建ApiCheck.java:

package com.hotel.util; import com.hotel.config.ConfigLoader; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; public class ApiCheck { public static void main(String[] args) throws Exception { String url = ConfigLoader.getTaotokenBaseUrl() + "/v1/models"; HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .header("Authorization", "Bearer " + ConfigLoader.getTaotokenApiKey()) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("状态码: " + response.statusCode()); System.out.println("响应体前 200 字符: " + response.body().substring(0, Math.min(200, response.body().length()))); } }

状态码返回 200 说明 Key 有效、baseUrl 正确。如果返回 401,检查 Key 是否复制完整;返回 404,检查 baseUrl 是否写成了https://taotoken.net/api。

5. 本篇常见错误排查

5.1 驱动类找不到

报错信息:

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

原因通常是mysql-connector-java的 jar 没有放进lib目录,或者没有 Add to Build Path。在 Eclipse 里右键项目 → Build Path → Configure Build Path → Libraries → Add JARs,选中lib/mysql-connector-java-8.0.33.jar。如果用的是 Maven 项目,检查pom.xml里有没有加依赖。

5.2 时区报错

报错信息:

The server time zone value '?D1ú±ê×?ê±??' is unrecognized

这是 MySQL 8 驱动要求明确时区。在jdbc.url里加上serverTimezone=Asia/Shanghai即可。如果还是不行,检查 MySQL 服务端的my.ini里default-time-zone配置。

5.3 Public Key Retrieval 报错

报错信息:

Public Key Retrieval is not allowed

在jdbc.url末尾加allowPublicKeyRetrieval=true。这个参数在 MySQL 8 默认的caching_sha2_password认证方式下需要。

5.4 配置文件读不到

报错信息:

db.properties 未找到,请检查 resources 目录

检查resources目录是否在 Build Path 的 Source 里。Eclipse 默认会把src当源码目录,resources需要手动添加。右键项目 → Build Path → Configure Build Path → Source → Add Folder,勾选resources。

5.5 TaoToken 请求 401

状态码 401 说明 Key 无效或没带上。检查三件事:settings.json里的apiKey是否填了真实值;环境变量TAOTOKEN_API_KEY是否覆盖了配置;请求头是不是Authorization: Bearer sk-xxx格式。如果 Key 是从控制台复制的,注意前后不要有空格。

5.6 连接池参数不生效

如果你用的是 HikariCP,db.properties里的jdbc.pool.*参数需要手动映射到HikariConfig对象。DriverManager本身不读这些参数。示例:

HikariConfig config = new HikariConfig(); config.setJdbcUrl(ConfigLoader.getDb("jdbc.url")); config.setUsername(ConfigLoader.getDb("jdbc.username")); config.setPassword(ConfigLoader.getDb("jdbc.password")); config.setMaximumPoolSize(Integer.parseInt( ConfigLoader.getDb("jdbc.pool.maximumPoolSize")));

不映射的话,这些参数就是摆设。

5.7 Swing 界面卡死

如果在 EDT 线程里直接调DBUtil.getConnection(),网络慢的时候界面会卡住。正确做法是把数据库操作放到SwingWorker的doInBackground里:

new SwingWorker<List<Room>, Void>() { @Override protected List<Room> doInBackground() throws Exception { return roomDao.findAll(); } @Override protected void done() { try { List<Room> rooms = get(); roomTableModel.setRooms(rooms); } catch (Exception e) { JOptionPane.showMessageDialog(null, "加载房态失败"); } } }.execute();

这个坑在二手项目里特别常见,界面一卡用户就以为程序死了。

6. 把配置骨架用起来:下一步动作

到这里,db.properties和settings.json两个骨架已经能跑通,StartupCheck和ApiCheck两个自检类也验证了数据库和 Key 链路。接下来你可以把ConfigLoader和DBUtil直接复制到你的酒店管理系统里,把room、guest表的 DAO 补上,Swing 界面里用SwingWorker调 DAO。

如果你在接入过程中遇到 Key 相关的问题,比如 401、403、请求超时,先去 API Keys 页面确认 Key 状态,地址是 https://taotoken.net/api-keys ,接入文档在 https://taotoken.net/doc 。需要调试模型返回内容,用模型对话页面 https://taotoken.net/models 。如果你打算把这个桌面系统扩展成带 Agent 能力的长期项目,比如自动处理订单、智能推荐房型,可以看 Coding Plan,入口在 https://taotoken.net/coding-plan 。

最后提醒一句:settings.json里的apiKey不要提交到 Git。在.gitignore里加上resources/settings.json,团队协作时每人本地填自己的 Key。数据库密码同理,db.properties也可以加入忽略列表,提供一个db.properties.example模板给其他人参考。这样既跑得通,又不会把敏感信息散出去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询