Spring AI RC2刚发2天,我手把手带你写个MCP Server,现在AI能查你数据库了
AI×Java 原创 · 2026年6月11日 · 实战教程
你觉得最离谱的AI编程场景是什么?
我见过程序员打开Claude Desktop,手动把自己的数据库schema贴进去,然后说"帮我写个查出本月销售额Top10客户的SQL"。
AI只是替你写了SQL,你还得复制粘贴到数据库客户端里去跑。这不是自动化,这是换了个打字员。
但如果我告诉你——AI现在能自己登录你的数据库,查表结构,写SQL并返回结果,全程不用你碰数据库客户端一下呢?
这不是幻想。Spring AI RC2(前天刚发)+ MCP(Model Context Protocol),就能做到。今天这篇,咱们从头到尾写一个能用的、能跑通的MCP Server,让AI变成你的专属数据库管家。
🎯 做完之后的效果
你对AI说:"数据库里有哪些表?给我看一下上个月的销售趋势。"
AI直接返回查询结果——没有手动复制粘贴,没有手动切工具,全程对话完成。
一、前置条件
别慌,环境不复杂。你需要这些:
✅ JDK 21 或更高(Spring AI 2.x 必须 Java 21)
✅ Spring Boot 4.0 +(跟 Spring AI 2.x 配套)
✅ Maven 或 Gradle
✅ 一个 H2 数据库(教程用内存库,跑完就能丢)
✅ Spring AI 2.0.0-RC2(需要加 Spring Milestone 仓库)
⚠️ 注意:Spring AI 2.0.0-RC2 还没有推到 Maven Central!Release Candidate 版本的 artifact 在 Spring 自己的 Milestone 仓库里。你需要在 pom.xml 里加一个仓库地址,后面会讲到。
二、为什么这个时间点讲MCP
两个原因:
第一,RC2 前天刚发。6月9号,Spring AI 发布了 2.0.0-RC2。虽然 GA 还没落地(别信那些说"今天6月11号发布"的——GitHub Milestone 的 due date 不等于发布日期,官方没有宣布),但 RC2 已经相当稳定了,修复了 8 个 RC1 遗留的 bug,包括 Bedrock 依赖回归、ChatModel 选项行为、Ollama 思考模式等关键问题。
🔗 RC2 变更摘要(来源:GitHub Releases)
· 新功能:Anthropic/OpenAI HTTP客户端可自定义配置
· 修复:Bedrock代理模型选项处理
· 修复:ChatModel选项恢复"替换"行为(非合并)
· 修复:Ollama多轮对话thinking字段丢失
· 修复:恢复Spring Framework < 7.0.4兼容性
· 修复:ToolCallingAdvisor始终自动注册
📎 Spring AI 2.0.0-RC2 Release Notes · 可信度:✅ 确凿
第二,MCP 正在变成基础设施。说白了,MCP 就是 AI 的"USB-C 接口"——你只要按协议实现,AI就能调你的工具。现在 Claude Desktop、Cursor、各种 AI 客户端都支持 MCP,这意味着你写的 MCP Server 可以在多个 AI 平台重复使用。Spring AI RC2 对 MCP 的支持已经非常完善了。
三、5步写出能用的数据库MCP Server
第1步:搭项目骨架
创一个 Spring Boot 项目。pom.xml 里最重要的是加对仓库和依赖:
<!-- 仓库:RC/Milestone 版本在 Spring 自己的仓库 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<!-- BOM 统一版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>2.0.0-RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 核心依赖 -->
<dependencies>
<!-- MCP Server -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>
<!-- H2 数据库 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
这里有个坑要提醒:Spring AI 2.x 依赖 Spring Boot 4.0+ 和 Spring Framework 7.x。如果你还在用 Spring Boot 3.x,别强行升级,用 Spring AI 1.1.7(最新稳定版)就够了。1.x 也支持 MCP——底层 SDK 是独立的。
第2步:定义MCP工具——@Tool注解
Spring AI 的 MCP 工具定义方式极其简单——在任意 Spring Bean 的方法上加 @Tool 注解就行。框架自动扫描并注册到 MCP Server。
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class DatabaseMcpTools {
private final JdbcTemplate jdbcTemplate;
public DatabaseMcpTools(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 列出数据库中的所有表名
*/
@Tool(description = "列出当前数据库中的所有表名")
public List<String> listTables() {
String sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES " +
"WHERE TABLE_SCHEMA = 'PUBLIC'";
return jdbcTemplate.queryForList(sql, String.class);
}
/**
* 查看某张表的结构(列名、类型)
*/
@Tool(description = "查看指定表的结构,包括列名和数据类型")
public List<Map<String, Object>> describeTable(
@ToolParam(description = "要查看的表名") String tableName) {
String sql = "SELECT COLUMN_NAME, TYPE_NAME, NULLABLE " +
"FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_NAME = ? AND TABLE_SCHEMA = 'PUBLIC'";
return jdbcTemplate.queryForList(sql, tableName);
}
/**
* 执行只读SQL查询(安全考虑,只允许SELECT)
*/
@Tool(description = "执行只读的SQL SELECT查询并返回结果。" +
"注意:只接受SELECT语句。")
public List<Map<String, Object>> executeQuery(
@ToolParam(description = "要执行的SELECT查询SQL语句")
String sql) {
// 安全检查:只允许 SELECT
String trimmed = sql.trim().toUpperCase();
if (!trimmed.startsWith("SELECT")) {
throw new IllegalArgumentException(
"只允许SELECT查询!不允许的SQL: " + sql);
}
return jdbcTemplate.queryForList(sql);
}
}
看明白了吗?三个工具:
· listTables() → AI 自己找到有哪些表
· describeTable() → AI 自己看每张表的字段和类型
· executeQuery() → AI 自己写 SQL 查数据
整个过程 AI 自己完成"了解数据库 → 写SQL → 返回结果"的闭环。你只需要对话。
第3步:配置 application.yml
spring:
application:
name: database-mcp-server
# H2 内存数据库配置
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
driver-class-name: org.h2.Driver
username: sa
password:
# 启动时初始化示例数据
sql:
init:
mode: always
schema-locations: classpath:schema.sql
data-locations: classpath:data.sql
# MCP Server 配置
ai:
mcp:
server:
name: "Database Query MCP Server"
version: "1.0.0"
type: SYNC # 同步模式,适合简单查询
protocol: STREAMABLE # 使用 Streamable HTTP 协议
第4步:准备测试数据
在 src/main/resources/ 下创建建表和灌数据脚本:
schema.sql
CREATE TABLE IF NOT EXISTS sales (
id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50),
amount DECIMAL(10, 2),
sale_date DATE
);
data.sql
INSERT INTO sales (product_name, category, amount, sale_date) VALUES
('机械键盘', '外设', 599.00, '2026-05-15'),
('显示器27寸', '外设', 2499.00, '2026-05-18'),
('Java编程思想', '书籍', 99.00, '2026-06-01'),
('AI编程指南', '书籍', 79.00, '2026-06-03'),
('人体工学椅', '办公家具', 2999.00, '2026-06-05'),
('降噪耳机', '外设', 1299.00, '2026-06-08'),
('机械键盘Pro', '外设', 899.00, '2026-06-10');
第5步:启动 & 验证
启动应用,MCP Server 自动注册到 /mcp 端点。
验证方式一:浏览器直接访问
# 查看服务器信息
GET http://localhost:8080/mcp
# 应该返回类似:
{
"protocolVersion": "2025-06-18",
"serverInfo": {
"name": "Database Query MCP Server",
"version": "1.0.0"
},
"capabilities": {
"tools": {}
}
}
验证方式二:Claude Desktop 接入
编辑 Claude Desktop 的配置文件:
// Windows: %APPDATA%/Claude/claude_desktop_config.json
// Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"database-query": {
"type": "url",
"url": "http://localhost:8080/mcp"
}
}
}
重启 Claude Desktop,它就能发现你注册的三个工具。然后你可以这样问它:
👤 你:"我的数据库里有什么表?帮我统计一下6月份的销售额。"
🤖 AI:先调用 listTables() 发现有一张 sales 表 → 调用 describeTable("sales") 看字段 → 调用 executeQuery("SELECT SUM(amount) FROM sales WHERE sale_date BETWEEN '2026-06-01' AND '2026-06-30'") → 返回"6月总销售额为 6375.00 元"。
整个过程你只发了一句话。这就是MCP的力量。
四、你可能踩的4个坑
坑1:MCP Server 端点 404
检查 Spring Boot 版本。Spring AI MCP Server starter 要求 Spring Boot 4.0+,如果用了旧版,端点不会自动注册。还有就是确认没有在 Security 配置里拦截 /mcp 路径。
坑2:@Tool 注解的方法没被注册
检查类上有没有 @Component / @Service 注解,确保 Bean 被 Spring 管理。另外,方法必须是 public 的。private 方法加 @Tool 不会生效。
坑3:H2 表找不到
H2 内存数据库默认在连接断开后清空。加上 DB_CLOSE_DELAY=-1 参数让它保持。另外注意 schema.sql 路径放在 classpath: 下。
坑4:Claude Desktop 连接不上
MCP Server 默认跑在 localhost:8080,但 Claude Desktop 需要通过 HTTP 连接。确认没有防火墙拦截。如果改了端口,记得更新 claude_desktop_config.json 里的 url。Windows 用户尤其注意——Claude Desktop 的配置路径跟 Mac 不一样。
五、还能做什么?3个扩展方向
方向1:接入真实数据库。把 H2 换成 MySQL/PostgreSQL,你的 AI 助手就能直接操作生产库(当然,executeQuery 的限制要更严格——比如加数据量限制、敏感表黑名单)。
方向2:不只数据库——任何 API 都能变 MCP 工具。写一个 @Tool 方法调 GitLab API 查 MR 状态、调 Jira API 查 Bug 列表、调 K8s API 查 Pod 状态……想法是你的,MCP 只负责连接。
方向3:从 Claude Desktop 扩展到全平台。你写的 MCP Server 不绑定任何特定 AI 客户端。Cursor、Windsurf、Continue.dev、Copilot——只要支持 MCP 协议,都能用。一劳永逸。
💡 一句话总结
AI 能写代码不是终点,AI 能替你操作工具才是。MCP 就是那条让 AI 从"ChatBot"进化到"数字同事"的路径。
📎 本文涉及的版本信息均已核实:
· Spring AI 2.0.0-RC2 — GitHub Releases · ✅确凿
· Spring AI MCP 官方文档 — spring.io
· 51CTO Spring AI RC 解读 — 51CTO · ⚠️第三方
💬 今日话题
你对接过 MCP 吗?你是用 Spring AI 还是直接用 MCP Java SDK?或者你还在观望——觉得"MCP 还没到能用的阶段"?
👇 评论区聊聊你的真实体验~
📌 觉得有用?
点个「在看」让更多 Java 同行看到~
转发给还在手动贴 SQL 的同事,救救他们 😂
🚀 关注我不错过
专注 AI × Java 实战,每周硬核干货
回复关键词领取资料:
📦 回复【工具包】→ 《2026 AI编程工具全家桶》
📖 回复【入门】→ 《Spring AI零基础入门指南》
💰 回复【面试】→ 《AI时代Java面试高频50题》
📊 你最希望下期看到什么内容?
A. Spring AI 2.0 GA 迁移实战(等它正式发布就写)
B. MCP Server 进阶——接入外部API(GitLab/Jira/K8s)
C. Java AI 框架终极对比 2026 年度版
D. 其他(评论区告诉我)
评论区回复字母即可 👇
Atlas · AI×Java 实战派
2026年6月11日 · 每周四实战教程
夜雨聆风