使用Claude Code构建一个 AI 增强的 MySQL 桌面客户端

人工备注说明

  • 开发工具Claude Code + (火山方舟)glm-5.1;
  • 这个项目完全使用Claude Code开发,大概2小时左右完成;
  • 这篇文章也是使用Claude Code编写;
  • 注意:这个应用只进行简单测试,未覆盖所有场景,可能存在异常的情况,文末提供源码供学习研究!

1、前言

在日常开发中,数据库客户端是我们最常使用的工具之一。Navicat、DBeaver、DataGrip 等工具功能强大,但有时候我们需要一个轻量、可定制的方案——既能满足日常查询需求,又能融入 AI 能力提升效率。本文将介绍一个基于 Java Swing 构建的 AI 增强数据库客户端,它虽然轻量,却涵盖了数据库管理的核心功能,并创新性地集成了自然语言转 SQL 和 SQL 优化等 AI 特性。

2、项目概览

这是一个面向 MySQL 的桌面 GUI 客户端,核心定位:

  • 轻量:纯 Java 桌面应用,一个 JAR 即可运行
  • 实用:覆盖数据库连接、SQL 编辑、数据浏览、导入导出等日常操作
  • 智能:集成兼容OpenAI API协议,支持自然语言生成 SQL 和 SQL 优化建议

3、技术栈

类别 技术选型 说明
语言 Java 17 使用现代 Java 特性
UI 框架 Swing + FlatLaf 3.6 FlatLaf 提供现代外观,告别原生 Swing 的年代感
SQL 编辑器 RSyntaxTextArea 3.6.0 语法高亮、代码折叠、自动补全
数据库驱动 MySQL Connector/J 8.3.0 官方 JDBC 驱动
HTTP/JSON Hutool 5.8.44 轻量工具库,用于 AI API 调用
AI 集成 LangChain4j 1.12.2 LLM 应用开发框架
数据导入导出 Apache POI 5.2.5 Excel 文件处理
日志 SLF4J + Log4j 2 标准日志方案
构建 Maven 含 assembly 打包插件

4、架构设计

项目采用经典的分层架构,职责清晰:

┌─────────────────────────────────────────────┐
│              表现层 (UI)                      │
│  MainFrame / ConnectionSessionPanel /        │
│  SqlEditorPanel / DbExplorerPanel / ...      │
├─────────────────────────────────────────────┤
│            业务逻辑层 (AI Service)            │
│  AiService / AiSettingsManager              │
├─────────────────────────────────────────────┤
│            数据访问层 (DB)                    │
│  ConnectionManager / QueryExecutor /         │
│  SchemaCache / QueryHistory                  │
├─────────────────────────────────────────────┤
│            数据模型层 (Model)                 │
│  ConnectionInfo / TableInfo / QueryResult    │
├─────────────────────────────────────────────┤
│            工具层 (Util)                     │
│  DataExporter / DataImporter                │
└─────────────────────────────────────────────┘

4.1、设计要点

单例模式广泛使用ConnectionManagerQueryExecutorAiServiceSchemaCache 等核心类均采用单例模式,确保资源统一管理。其中 ConnectionManager 使用 Holder 类实现懒加载,既保证线程安全又避免同步开销。

线程安全:连接存储使用 ConcurrentHashMap,历史记录使用 Collections.synchronizedList,SQL 执行支持后台线程和取消操作,保证 UI 在长时间查询时依然响应。

本地持久化:连接历史、查询历史、AI 设置等均通过 Java 序列化存储在用户目录下(~/.dbclient_*),无需额外数据库,轻量且零配置。

5、核心功能详解

5.1. 多连接多标签管理

主窗口采用多标签设计,每个标签对应一个独立的数据库连接会话:

  • 左侧:数据库对象浏览器(树形结构),展示数据库、表、视图、存储过程、函数、触发器、事件
  • 右侧:SQL 编辑器 + 结果面板

每个 ConnectionSessionPanel 是一个完整的工作区,互不干扰,方便同时操作多个数据库实例。

5.2. 智能数据库浏览器

树形浏览器不只是展示对象列表,它提供了丰富的右键菜单操作:

  • 数据库级别:新建表、删除数据库、设为默认库
  • 表级别:查看数据、查看结构、生成 SELECT/INSERT/UPDATE/DELETE 语句、清空表、删除表、导入数据
  • 视图级别:查看数据、生成 SELECT、删除视图
  • 列级别:复制列名

双击任意对象,名称自动插入到 SQL 编辑器中,减少手动输入。

5.3. 专业级 SQL 编辑器

SQL 编辑器是日常使用最频繁的组件,基于 RSyntaxTextArea 构建:

  • 语法高亮:SQL 关键字、字符串、注释一目了然
  • 代码补全:集成 SQL 关键字补全 + 数据库 Schema 补全(表名、列名),补全数据来自 SchemaCache
  • 快捷执行F5 执行全部,Ctrl+Enter 执行选中部分
  • SQL 格式化:一键将关键字大写、添加换行缩进
  • 查询历史:保存最近 1000 条查询记录,支持搜索、重新执行、复制到编辑器

5.4. 表结构查看器

以多标签页形式展示表的完整元数据:

  • 列信息:列名、类型、大小、是否可空、是否主键
  • 索引信息:索引名、类型、包含列、排序方式
  • 外键信息:引用表和引用列
  • DDL 语句:原始 CREATE TABLE 语句,语法高亮显示

5.5. 数据浏览与分页

TableDataViewerPanel 提供了分页浏览表数据的能力:

  • 支持自定义每页行数(50/100/200/500)
  • 首页/上一页/下一页/末页导航
  • 结果表格支持排序和实时行过滤
  • 右键菜单支持复制单元格、整行、整表

5.6. 数据导入导出

导出:查询结果支持三种格式导出

  • CSV:UTF-8 编码,可选是否包含表头
  • JSON:格式化输出,易读
  • Excel (XLSX):使用 SXSSFWorkbook 流式写入,支持大数据量;表头加粗,列宽自动调整

导入:支持 CSV 和 Excel 文件导入

  • 列映射配置
  • 可选首行作为表头
  • 支持导入前清空表
  • 可配置遇到错误时停止或继续
  • 批量提交(可配置 batch size)
  • 导入前预览前 10 行数据
  • 实时进度反馈

5.7. 建表向导

可视化建表工具,无需手写 DDL:

  • 填写表名和注释
  • 添加列:列名、数据类型(MySQL 类型下拉选择)、大小、是否可空、是否主键、是否自增、默认值、注释
  • 实时 SQL 预览
  • 支持列的增删和排序

6、AI 增强功能

这是本项目最具差异化的特性。通过集成 OpenAI API协议,实现了两个核心 AI 功能:

6.1、自然语言转 SQL

在 AI 面板中用自然语言描述需求,AI 会结合当前数据库的 Schema 上下文生成对应的 SQL 语句。例如输入"查询最近7天注册的用户数量",AI 会自动生成:

SELECT COUNT(*) AS user_count
FROM users
WHERE register_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
LIMIT 100;

实现原理:

  1. SchemaCache 获取当前数据库的表结构信息
  2. 构建 System Prompt,包含 Schema 上下文和 SQL 生成规则(只返回 SQL、默认 LIMIT 100、关键字大写)
  3. 调用 OpenAI Chat API,将用户自然语言输入和 System Prompt 一起发送
  4. 返回纯 SQL 语句,直接插入编辑器执行

6.2、SQL 优化建议

选中一条 SQL,AI 会分析其执行逻辑并给出优化建议,例如索引推荐、查询重写等。

6.3、AI 配置

通过 AiSettingsManager 管理 API Key、Base URL 和模型选择,支持兼容 OpenAI 接口的第三方服务(如国内的 API 代理),配置持久化到本地文件。

7、关键实现细节

7.1、ConnectionManager 的线程安全设计

// Holder 类实现懒加载单例,既线程安全又无同步开销
private static class Holder {
    private static final ConnectionManager INSTANCE = new ConnectionManager();
}

// ConcurrentHashMap 存储多连接
private final Map<String, ConnectionEntry> connections = new ConcurrentHashMap<>();

7.2、SchemaCache 加速自动补全

Schema 信息通过 SchemaCache 缓存,避免每次补全都查询数据库元数据。缓存以 connectionName:database 为 key,支持按需刷新和全部失效:

// 缓存结构
private final Map<String, DatabaseSchema> cache = new ConcurrentHashMap<>();

// 获取列名用于自动补全
public List<String> getColumnNames(String connectionName, String database, String tableName)

7.3、QueryExecutor 的查询取消

长时间查询不应阻塞 UI。QueryExecutor 在后台线程执行 SQL,并将活跃的 Statement 存入 Map,用户点击"停止"时调用 Statement.cancel() 中断查询:

private final Map<String, Statement> activeStatements = new ConcurrentHashMap<>();

public void cancelExecution(String queryId) {
    Statement stmt = activeStatements.get(queryId);
    if (stmt != null) {
        stmt.cancel();
    }
}

7.4、DataExporter 的大数据量处理

Excel 导出使用 SXSSFWorkbook(流式 API),数据逐行写入磁盘而非全部驻留内存,避免 OOM:

SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 内存中只保留 100 行

8、本地数据持久化方案

项目选择 Java 序列化而非数据库来存储本地配置,保持零依赖:

文件 内容
~/.dbclient_history 连接历史(主机、端口、用户名等)
~/.dbclient_query_history 查询历史(SQL、执行时间、结果行数)
~/.dbclient_ai_settings AI 配置(API Key、Base URL、模型)

9、构建与运行

# 编译
mvn clean compile

# 运行
mvn exec:java -Dexec.mainClass="com.penngo.dbclient.Main"

# 打包(含依赖的可执行 JAR)
mvn clean package
java -jar target/db_client-1.0-SNAPSHOT-jar-with-dependencies.jar

9.1、运行效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

10、总结

这个项目展示了如何用 Java Swing 构建一个功能完整的桌面数据库客户端,并在传统工具中融入 AI 能力。关键设计思路值得借鉴:

  1. 分层清晰:UI、业务、数据访问各司其职,新增功能不牵一发动全身
  2. 线程安全优先:Swing 应用中,数据库操作必须在后台线程,UI 更新必须在 EDT,项目中通过 SwingWorker 和回调模式妥善处理
  3. AI 集成要带上下文:自然语言转 SQL 的关键是把数据库 Schema 作为上下文传给 LLM,而非让 AI 凭空猜测
  4. 大数据量友好:Excel 导出用流式 API,查询支持取消和分页,避免桌面应用的通病——卡死

如果你也在考虑为内部工具增加 AI 能力,或者需要一个轻量可定制的 MySQL 客户端,希望这个项目能给你一些启发。

附件源码

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐