自然语言转SQL语句实现增删改查操作

在页面上输入自然语言 然后调用本地大模型 将自然语言转为sql语句 再对数据库进行增删改查的操作 更容易操作数据库

首先需要了解一下什么是ORM(对象关系映射):简单来说就是在关系型数据库和对象(Bean,Entity)之间作一个映射,通过这种映射 我们就可以用面向对象编程(OOP)概念喝语法来操作数据库 不需要直接写SQL语句 ORM设计可以实现数据存取与业务逻辑完全分离 Java中现在主流的ORM框架包括:

1.Hibernate:最流行的Java ORM框架之一

2.MyBatis:一种"半自动"的ORM框架

3.MyBatis-plus:MyBatis增强版 自带 CRUD、分页、Wrapper 等

MyBatis和Hibernate的区别可以看这篇文章:MyBatis和Hibernate到底哪个好

本文使用的是Hibernate框架 因为他是spring默认的ORM框架 且支持快速开发 实现起来比较方便 而且我现在实现的只是一些简单的增删改查 数据量也不是很大 所以选用Hinernate框架

在pom文件中添加下面依赖 即可使用

1
2
3
4
5
6
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Hibernate有两种映射方法  一种是基于xml文件进行映射 一种是基于注解映射

配置方法1 :在hibernate.cfg.xml文件中配置数据库和映射文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/数据库名</property>
        <property name="hibernate.connection.username">账号</property>
        <property name="hibernate.connection.password">密码</property>

        <!-- SQL方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>

        <!-- 显示SQL语句 -->
        <property name="hibernate.show_sql">true</property>

        <!-- 自动创建表 -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 映射文件 -->
        <mapping resource="com/example/model/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

配置方法2:即在yml文件中配置:然后在实体类上用注解的方式实现映射

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect

在entity包创建实体 Hibernate可以通过实体类自动生成表结构 Hibernate框架

参考Hibernate的执行过程,简单说明一下Hibernate的执行过程

创建configuration实例,加载配置文件和映射文件到实例中–创建sessionFactory实例–创建session实例(非线程安全,每次请求创建一个新实例)–创建Transaction实例开启事务–利用session接口进行持久化操作–提交事务–关闭session和sessionFactory断开连接

项目的实现过程:首先前端有两个按钮 测试连接和执行查询 前端将请求发送给后端 点击测试连接来测试是否连接到数据库 点击执行按钮会将输入的文本传入后端 后端通过调用本地大模型将其转换为SQL语句 并且执行SQL操作 实现自然语言操作数据库的功能

遇到的问题1:后端端口在8080 前端端口在63342 浏览器默认阻止不同源之间的请求 所以需要CORS配置(跨域资源共享) 在WebConfig文件中加入下面代码实现跨域资源共享

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//配置全局CORS
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://localhost:63342") // 根据实际前端端口调整
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowCredentials(true);
    }
}

遇到的问题2:调用的本地模型是qwen2:0.5b 他太逊了(其实是我prompt没给对)刚开始一直不能将文本语言转为正确的SQL语句 后面换了几次prompt才能正常运行。

运行页面: 第一次查询失败 因为我犯蠢了 没将ollama启动

nltodb查询失败1

nltodb查询成功

nltodb精准查询

用英文操作其实也是阔以的 因为输入的文本都是传入给本地大模型了 他会给你正确的sql语句 正确的操作数据库

nltodb英文查询

现在这个系统只是实现了查询功能 其他增删改操作实现起来跟查询操作大同小异 所以通过自然语言操作数据库是可行的并且有益于降低数据操作的门槛 GitHub上有好多优秀的开源项目 这里我就不一一列举了 总之 这个系统只是一个简单的MCP数据库的基本实现。

项目源码地址:https://github.com/1parado/MCP-Database

Licensed under CC BY-NC-SA 4.0
Last updated on Oct 23, 2025 11:12 CST
本站总字数:97.9k 字
载入天数...载入时分秒... ·