DEV Community

Jane for Mastering Backend

Posted on • Originally published at masteringbackend.com on

Building an AI SQL Translator with Java, Spring Boot, and OpenAI

title

Writing SQL queries can sometimes feel tricky, especially for people who are not very familiar with databases. For example, if someone wants to find “all users who joined after 2022,” they first need to know the right SQL syntax. Wouldn’t it be easier if they could just type the question in plain English and get the SQL query instantly?

That’s exactly what we are going to build in this article. Using Java , Spring Boot , and OpenAI , we’ll create a small application that works like an AI SQL Translator. You type a normal question, and the app gives you the SQL query that matches it.

To make this possible, we’ll use Spring AI , a new library that makes it simple for Java developers to add AI features to their applications. It connects easily with services like OpenAI and works smoothly with Spring Boot. This means we don’t need to worry about complex AI code-the library handles most of it for us.

By the end of this tutorial, you’ll have a working project where plain English questions are turned into SQL queries. Let’s get started and see how AI can make working with databases much easier.

Getting Started with Spring AI

To use Spring AI in your Spring Boot project, you need to follow a few basic steps. Here’s a beginner-friendly guide to help you get started using OpenAI with Spring AI 1.0.0.

Step 1: Go to Spring Initializr

  • Open your browser and go to https://start.spring.io
  • Project: Maven
  • Language: Java 21
  • Spring Boot: 3.5.x
  • Group: ayshriv
  • Artifact: sqltranslator
  • Name: sqltranslator

Choose the following project settings

spring Initializr explained

From the Dependencies section, search and add:

  • Spring Web  — for creating REST APIs
  • Spring AI OpenAI  — this might not be listed by default, so we will add it manually in the pom.xml file later
  • (Optional) H2 Database

Here’s how your full pom.xml might look like

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                      https://maven.apache.org/xsd/maven-4.0.0.xsd"> 
     <modelVersion>4.0.0</modelVersion> 

     <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>3.5.5</version> 
        <relativePath/> 
     </parent> 

     <groupId>com.ayshriv</groupId> 
     <artifactId>SqlTranslator</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <name>SqlTranslator</name> 
     <description>AI SQL Translator with Java, Spring Boot, and OpenAI</description> 

     <properties> 
         <java.version>21</java.version> 
         <spring-ai.version>1.0.0</spring-ai.version> 
     </properties> 

     <repositories> 
         <repository> 
             <id>spring-milestones</id> 
             <name>Spring Milestones</name> 
             <url>https://repo.spring.io/milestone</url> 
          </repository> 
          <repository> 
              <id>spring-snapshots</id> 
              <name>Spring Snapshots</name> 
              <url>https://repo.spring.io/snapshot</url> 
              <snapshots><enabled>true</enabled></snapshots> 
          </repository> 
      </repositories> 

       <dependencies> 
           <!-- Spring Boot web stack --> 
           <dependency> 
               <groupId>org.springframework.boot</groupId> 
               <artifactId>spring-boot-starter-web</artifactId> 
            </dependency> 
            <dependency> 
                 <groupId>org.springframework.boot</groupId> 
                 <artifactId>spring-boot-starter-validation</artifactId> 
             </dependency> 
             <dependency> 
                 <groupId>org.springframework.boot</groupId> 
                 <artifactId>spring-boot-starter-actuator</artifactId> 
             </dependency> 

              <!-- Lombok (optional) --> 
              <dependency> 
                  <groupId>org.projectlombok</groupId> 
                  <artifactId>lombok</artifactId> 
                  <optional>true</optional> 
               </dependency> 

               <dependency> 
                   <groupId>org.springframework.ai</groupId> 
                   <artifactId>spring-ai-starter-model-openai</artifactId> 
               </dependency> 
               <dependency> 
               <groupId>com.h2database</groupId> 
               <artifactId>h2</artifactId> 
               <scope>runtime</scope> 
                           </dependency> 

               <!-- Testing --> 
               <dependency> 
                   <groupId>org.springframework.boot</groupId> 
                   <artifactId>spring-boot-starter-test</artifactId> 
                   <scope>test</scope> 
                </dependency> 
             </dependencies> 

            <dependencyManagement> 
                <dependencies> 
                   <dependency> 
                       <groupId>org.springframework.ai</groupId> 
                       <artifactId>spring-ai-bom</artifactId> 
                       <version>${spring-ai.version}</version> 
                       <type>pom</type> 
                       <scope>import</scope> 
                   </dependency> 
               </dependencies> 
           </dependencyManagement> 

           <build> 
              <plugins> 
                  <plugin> 
                      <groupId>org.apache.maven.plugins</groupId> 
                      <artifactId>maven-compiler-plugin</artifactId> 
                      <configuration> 
                         <release>${java.version}</release> 
                         <annotationProcessorPaths> 
                             <path> 
                                 <groupId>org.projectlombok</groupId> 
                                 <artifactId>lombok</artifactId> 
                             </path> 
                         </annotationProcessorPaths> 
                     </configuration> 
                  </plugin> 
                   <plugin> 
                       <groupId>org.springframework.boot</groupId> 
                       <artifactId>spring-boot-maven-plugin</artifactId> 
                   </plugin> 
               </plugins> 
            </build> 
         </project>
Enter fullscreen mode Exit fullscreen mode

How to generate OpenAI key ?

Step 1: Go to the OpenAI Website

Visit https://platform.openai.com in your browser.

Step 2: Sign In or Create an Account

Log in using your existing OpenAI account. If you don’t have one, sign up using your email, Google, or Microsoft account.

Step 3: Open the API Keys Section

Once logged in, click on your profile icon (top-right corner) and select “View API Keys” or go to https://platform.openai.com/account/api-keys directly.

Step 4: Generate a New API Key

Click on the “Create new secret key” button. A new key will be generated.

Step 5: Copy and Save Your Key

Copy the key and store it in a safe place (such as a password manager or .env file). You won't be able to view it again after closing the popup.

Step 2: Configure Your OpenAI API Key

spring: 
  ai: 
    openai: 
      api-key: YOUR_OPENAI_API_KEY 
      chat: 
        options: 
          model: gpt-4o-mini 
server: 
  port: 8080
Enter fullscreen mode Exit fullscreen mode

Never share your API key in your code or upload it to public platforms like GitHub. If someone gets access to your key, they can misuse it, which could lead to unexpected charges or security issues. Instead, store your API key in a safe place, such as environment variables or a secure configuration file. For production applications, it’s recommended to use a secret manager or secure vault service to keep your keys and sensitive information protected.

Step 3: Project Structure

sqltranslator/ 
│── pom.xml 
│── src 
│ ├── main 
│ │ ├── java 
│ │ │ └── ayshriv 
│ │ │ └── sqltranslator 
│ │ │ ├── SqltranslatorApplication.java # Main entry point 
│ │ │ │ 
│ │ │ ├── controller 
│ │ │ │ └── SqlController.java # REST API layer 
│ │ │ │ 
│ │ │ ├── dto 
│ │ │ │ └── SqlRequest.java # Request DTO 
│ │ │ │ 
│ │ │ └── service 
│ │ │ └── SqlAiService.java # AI logic with Spring AI 
│ │ │ 
│ │ └── resources 
│ │ ├── application.yml # Spring config (API Key, etc.) 
│ │ └── static/ # (Optional) Frontend files 
│ │ 
│ └── test 
│ └── java 
│ └── ayshriv 
│ └── sqltranslator 
│ └── SqltranslatorApplicationTests.java # Unit tests
Enter fullscreen mode Exit fullscreen mode

Step 4: Create DTO’s

package ayshriv.sqltranslator.dto; 

public class SqlRequest { 
    private String question; 

    public String getQuestion() { 
        return question; 
    } 
    public void setQuestion(String question) { 
        this.question = question; 
     } 
  }
Enter fullscreen mode Exit fullscreen mode

In this code defines a simple Java class called SqlRequest that is used to carry data, usually from the user to the server. It has one private field called question which stores the user's input, like a natural language question. To keep the field safe and follow best practices, the class provides a getter method getQuestion() to read the value and a setter method setQuestion() to update the value. This kind of class is often called a DTO (Data Transfer Object) and is commonly used in Spring Boot projects when receiving or sending data in APIs.

Step 5: Create Service Layer

package ayshriv.sqltranslator.service; 

import org.springframework.ai.chat.client.ChatClient; 
import org.springframework.ai.chat.prompt.PromptTemplate; 
import org.springframework.stereotype.Service; 

import java.util.Map; 

@Service 
public class SqlAiService { 

     private final ChatClient chatClient; 

     public SqlAiService(ChatClient.Builder builder) { 
         this.chatClient = builder.build(); 
     } 

     public String generateSql(String question) { 
         String template = """ 
                 You are an SQL expert. 
                 Convert the following natural language question into a valid SQL query. 
                 Question: {question} 
                 SQL: 
                 """; 

          PromptTemplate prompt = new PromptTemplate(template, Map.of("question", question)); 

          return chatClient.prompt(prompt) 
                  .call() 
                  .content(); 
          } 
      }
Enter fullscreen mode Exit fullscreen mode

In this code defines a Spring Boot service class called SqlAiService that uses Spring AI to turn natural language questions into SQL queries. It is marked with @Service, meaning it is a service layer component in the application. Inside the class, a ChatClient is used to communicate with the AI model. The constructor takes a ChatClient.Builder and builds the client for use. The main method generate Sql(String question) creates a text template that tells the AI: "You are an SQL expert. Convert the question into a valid SQL query." It then uses a Prompt Template to replace {question} with the actual user input. Finally, it sends this prompt to the AI using the chatClient, gets the response, and returns the SQL query as a string. In short, this service takes a natural language question from the user and produces the corresponding SQL query using AI.

Step 6: Create REST Controller

package ayshriv.sqltranslator.controller; 

import ayshriv.sqltranslator.dto.SqlRequest; 
import ayshriv.sqltranslator.service.SqlAiService; 
import org.springframework.web.bind.annotation.*; 

@RestController 
@RequestMapping("/api/sql") 
public class SqlController { 

    private final SqlAiService sqlAiService; 

    public SqlController(SqlAiService sqlAiService) { 
        this.sqlAiService = sqlAiService; 
    } 

    @PostMapping("/generate") 
    public String generateSql(@RequestBody SqlRequest request) { 
        return sqlAiService.generateSql(request.getQuestion()); 
     } 
 }
Enter fullscreen mode Exit fullscreen mode

In this code defines a Spring Boot REST controller named SqlController that handles API requests for generating SQL queries. It is marked with @RestController, meaning it can receive HTTP requests and return responses, and all its routes start with /api/sql because of @RequestMapping. Inside the class, it uses SqlAiService to perform the actual SQL generation. The controller has one endpoint, /generate, which listens for POST requests. When a request comes in with a JSON body containing a question (wrapped in the SqlRequest DTO), the method generateSql() calls the service's generateSql() method, passes the question to it, and returns the generated SQL query as the response. In short, this controller is the entry point for clients to send natural language questions and get back SQL queries.

Step 7: Testing

cURL Example 1 — Simple Query

curl -X POST http://localhost:8080/api/sql/generate \ 
   -H "Content-Type: application/json" \ 
   -d '{"question":"Get all users older than 25"}'
Enter fullscreen mode Exit fullscreen mode

Response

SELECT * FROM users WHERE age > 25;
Enter fullscreen mode Exit fullscreen mode

cURL Example 2 — Another Query

curl -X POST http://localhost:8080/api/sql/generate \ 
-H "Content-Type: application/json" \ 
-d '{"question":"Find all employees who joined after 2022"}'
Enter fullscreen mode Exit fullscreen mode

Response

SELECT * FROM employees WHERE join_date > '2022-12-31';
Enter fullscreen mode Exit fullscreen mode

cURL Example 3 — Aggregation Query

curl -X POST http://localhost:8080/api/sql/generate \ 
   -H "Content-Type: application/json" \ 
   -d '{"question":"Show the average salary of employees in each department"}'
Enter fullscreen mode Exit fullscreen mode

Response

SELECT department, AVG(salary) 
FROM employees 
GROUP BY department;
Enter fullscreen mode Exit fullscreen mode

Conclusion

We built a simple AI SQL Translator using *Java, Spring Boot, and OpenAI *. It takes plain English questions and turns them into SQL queries. This project is a starting point-you can extend it to run queries on real databases, add schema awareness, or build a UI. With Spring AI, adding AI features to Java apps becomes simple and powerful.

Have a great one!!!

Author: Ayush Shrivastava


Thank you for being a part of the community

Before you go:

Whenever you’re ready

There are 4 ways we can help you become a great backend engineer:

  • The MB Platform: Join thousands of backend engineers learning backend engineering. Build real-world backend projects, learn from expert-vetted courses and roadmaps, track your learnings and set schedules, and solve backend engineering tasks, exercises, and challenges.
  • The MB Academy: The “MB Academy” is a 6-month intensive Advanced Backend Engineering Boot Camp to produce great backend engineers.
  • Join Backend Weekly: If you like posts like this, you will absolutely enjoy our exclusive weekly newsletter, sharing exclusive backend engineering resources to help you become a great Backend Engineer.
  • Get Backend Jobs: Find over 2,000+ Tailored International Remote Backend Jobs or Reach 50,000+ backend engineers on the #1 Backend Engineering Job Board.

Originally published at https://masteringbackend.com on September 2, 2025.


Top comments (2)

Collapse
 
zarajohnson profile image
Zara Johnson

Great work! Love how you’ve simplified SQL with AI - super practical and impactful

Collapse
 
janefrances profile image
Jane Mastering Backend

Thank you Zara! I'm really glad you found it helpful.