news 2026/6/9 23:29:38

再见 MyBatis Generator!我用 Java 调用 DeepSeek 实现了“自然语言查库” (Text-to-SQL)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
再见 MyBatis Generator!我用 Java 调用 DeepSeek 实现了“自然语言查库” (Text-to-SQL)

🗑️ 前言:受够了QueryWrapper的拼装

做 Java 后端的兄弟们,这种代码你们一定写吐过:

// 传统写法:为了查个数据,拼了一堆条件LambdaQueryWrapper<User>wrapper=newLambdaQueryWrapper<>();wrapper.eq(User::getStatus,1).ge(User::getCreateTime,"2025-01-01").like(User::getName,"张").orderByDesc(User::getId);List<User>list=userMapper.selectList(wrapper);

或者用 MyBatis Generator 生成一堆臃肿的 XML,为了加个字段还得改半天。

时代变了。
现在的 AI(特别是国产之光DeepSeek-V3/R1)在写 SQL 方面已经达到了精通级别。
我们为什么还要手动拼条件?为什么不能直接对系统说:

“帮我查一下 2025 年注册的、姓张的活跃用户,按注册时间倒序排。”

今天,我就带大家用Java + DeepSeek API,手搓一个Text-to-SQL引擎,彻底颠覆你的查库体验!


🧠 核心原理:AI 是怎么“懂”你的数据库的?

AI 不是神,它不知道你数据库里有张表叫t_user,也不知道status=1代表活跃。
我们需要用到RAG (检索增强生成)的思路,把数据库的Schema (元数据)喂给 AI。

流程图解:

执行与安全
构造提示词
1. JDBC读取元数据
拼接
拼接
2. 发送请求
3. 返回 SQL
4. 校验与执行
5. 结果集
6. JSON响应
数据库 MySQL
SELECT * FROM t_user...
表结构: t_user字段定义
Java应用
最终 Prompt
用户输入: 查25年活跃用户
DeepSeek V3 模型

🛠️ 实战开发:三步实现“说话即查询”

我们将使用 Spring Boot 和标准的 HTTP Client 来实现。

第一步:提取数据库“骨架” (Schema)

AI 需要知道表名和字段名才能写 SQL。我们可以写一个工具类,利用DataSource提取 DDL。

importjava.sql.Connection;importjava.sql.DatabaseMetaData;importjava.sql.ResultSet;publicStringgetTableSchema(StringtableName){StringBuilderschema=newStringBuilder();try(Connectionconn=dataSource.getConnection()){DatabaseMetaDatameta=conn.getMetaData();// 获取列信息ResultSetcolumns=meta.getColumns(null,null,tableName,null);schema.append("Table: ").append(tableName).append("\nColumns:\n");while(columns.next()){StringcolName=columns.getString("COLUMN_NAME");Stringtype=columns.getString("TYPE_NAME");Stringremarks=columns.getString("REMARKS");// 字段注释很重要!schema.append(String.format(" - %s (%s): %s\n",colName,type,remarks));}}catch(Exceptione){e.printStackTrace();}returnschema.toString();}

生成的 Context 类似:

Table: t_user
Columns:

  • user_id (BIGINT): 用户主键
  • status (INT): 状态 1正常 0冻结
第二步:构造超级 Prompt (提示词工程)

这是最关键的一步。我们要告诉 DeepSeek:你是一个 SQL 专家,不要废话,只给我 SQL。

publicStringgenerateSql(StringuserQuery,StringtableSchema){StringsystemPrompt=""" 你是一个 MySQL 专家。请根据提供的表结构,将用户的自然语言转换为 SQL 语句。 【要求】 1. 只返回 SQL 语句,不要包含 Markdown 格式(如 ```sql)。 2. 不要解释,不要啰嗦。 3. 只能进行 SELECT 操作,严禁 DELETE/UPDATE/DROP。 4. 如果无法生成,返回 "ERROR"。 """;StringuserPrompt=String.format(""" 【表结构】 %s 【用户需求】 %s """,tableSchema,userQuery);// 调用 DeepSeek API (伪代码)returndeepSeekClient.chat(systemPrompt,userPrompt);}
第三步:执行 SQL 并返回结果

拿到 SQL 后,用JdbcTemplate执行它。

@RestController@RequestMapping("/ai/sql")publicclassAiSqlController{@AutowiredprivateJdbcTemplatejdbcTemplate;@PostMapping("/query")publicList<Map<String,Object>>query(@RequestBodyStringquestion){// 1. 获取 Schema (这里以 t_user 为例,实际可动态获取)Stringschema=getTableSchema("t_user");// 2. AI 生成 SQLStringsql=aiService.generateSql(question,schema);System.out.println("🤖 AI 生成 SQL: "+sql);// 3. 安全检查 (简单版)if(!sql.trim().toLowerCase().startsWith("select")){thrownewRuntimeException("安全警告:AI 试图执行非查询操作!");}// 4. 执行并返回returnjdbcTemplate.queryForList(sql);}}

💥 效果演示:见证 AI 的压迫感

启动服务,用 Postman 发送请求:

Input:

“统计每个月注册的用户数量,只要 2024 年的数据。”

Console Output:

🤖 AI 生成SQL:SELECTDATE_FORMAT(create_time,'%Y-%m')ASmonth,COUNT(*)AScountFROMt_userWHEREcreate_time>='2024-01-01 00:00:00'ANDcreate_time<='2024-12-31 23:59:59'GROUPBYmonth;

Response:

[{"month":"2024-01","count":120},{"month":"2024-02","count":85}]

完美的日期格式化,完美的 Group By!
如果你用QueryWrapper写这段逻辑,起码要 5 行代码,还要查DATE_FORMAT的语法。而 AI 只需要 1 秒。


🛡️ 生产环境避坑指南

虽然很爽,但要在大厂上线,还得解决三个问题:

  1. 安全性 (SQL Injection)
    • 账号隔离:执行 SQL 的 JDBC 连接,必须配置只读权限 (Read-Only)的数据库账号。
    • 规则拦截:在 Java 层拦截DROP,TRUNCATE,GRANT等敏感关键词。
  2. 准确性 (Ambiguity)
    • 字段名要写好注释。AI 只有看到注释“1表示正常”,才知道status=1
    • 使用Few-Shot (少样本学习):在 Prompt 里给 AI 几个标准问答的例子,它的准确率会飙升。
  3. 性能 (Latency)
    • 大模型生成 SQL 需要时间(约 1-2 秒)。这不适合高并发的 C 端接口,但非常适合B 端后台、报表系统、数据分析平台

📝 总结

MyBatis Generator 属于代码生成时代,它解决的是“少写重复代码”。
Text-to-SQL 属于智能交互时代,它解决的是“降低数据获取门槛”。

不要觉得 AI 离我们很远。哪怕只是在你的后台管理系统里加上这么一个搜索框,运营小姐姐都会把你夸上天——因为她再也不用求你去跑 SQL 导数据了!


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 7:26:23

关于文章仿写任务的说明

关于文章仿写任务的说明 【免费下载链接】ERNIE-4.5-0.3B-Paddle 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERNIE-4.5-0.3B-Paddle 您好&#xff0c;我已明晰您所提出的专业文章仿写专家的相关要求&#xff0c;包括详细的工作流程以及各项仿写规范。然而&am…

作者头像 李华
网站建设 2026/6/10 1:47:52

11、数字取证存储介质处理全解析

数字取证存储介质处理全解析 在数字取证领域,对存储介质的处理涉及多个关键环节,包括了解常见总线和接口速度、应对磁盘温度问题、建立写保护机制,以及将目标介质连接到采集主机等。下面将详细介绍这些方面的内容。 常见总线和接口速度 不同的总线和接口具有不同的数据传…

作者头像 李华
网站建设 2026/6/10 9:06:54

19、提升个人效率的实用工具与技巧

提升个人效率的实用工具与技巧 在日常生活和工作中,合理安排时间、设置提醒和任务对于提高个人效率至关重要。本文将介绍一些实用的工具和命令,帮助你更好地管理时间和任务。 1. 使用 at 命令安排一次性提醒和任务 at 命令位于 /usr/bin 目录下,可用于在指定时间运行命令…

作者头像 李华
网站建设 2026/6/10 11:02:25

23、磁盘数据擦除与镜像访问技术全解析

磁盘数据擦除与镜像访问技术全解析 磁盘数据擦除方法 在处理磁盘数据时,安全地擦除数据至关重要,以下介绍几种常见的磁盘数据擦除方法: 1. 使用 dd 命令擦除 :可以使用 dd 命令结合 /dev/zero 作为输入文件来完成磁盘擦除任务,但 dc3dd 速度更快。为确认磁盘已…

作者头像 李华
网站建设 2026/6/10 2:22:31

AI智能写作工具精选:9款高效平台助您轻松完成开题报告与学术论文

在毕业论文季&#xff0c;高效完成开题报告和论文是很多学子的痛点。人工写作虽然灵活&#xff0c;但耗时耗力&#xff1b;而AI工具的兴起&#xff0c;能快速生成内容、优化重复率和AI痕迹。今天&#xff0c;我通过9款平台对比&#xff0c;帮你找出最适合的“学术搭档”。先从人…

作者头像 李华
网站建设 2026/6/10 15:39:26

Java毕设项目:基于Java的医院血库管理系统的设计与实现献血人员管理、采血登记管理、血液检测管理、体检信息管理、血库信息管理(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华