Quickly build a Spring Boot and Spring Data JPA RESTFul Web Service using a Microsoft SQL Server database instance running in Docker container.
Tutorial Contents
Overview
In this tutorial we will build a Spring Boot based RESTful web service using Microsoft SQL Server and Spring Data JPA – Hibernate in the persistence layer.
We will cover steps to build a basic Spring Boot application from scratch and add all the required dependencies. We’ll create an Entity Bean, a Spring Data Repository Interface, and a Spring REST Controller to expose standard GET, POST, PUT, and DELETE endpoints. On top of that, we will also cover how to run MS SQL Server database instance locally using Docker container.
MS SQL Server in Docker Container
This step is optional, if you already have a locally available MS SQL Server instance. Else, you can follow the steps to launch an instance quickly.
Prepare a docker-compose.yml file and add the MS SQL Server image details and a few configurations.
docker-compose.yml
version: "3"
services:
database:
restart: always
image: mcr.microsoft.com/mssql/server
container_name: ms-sql-server-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=password
ports:
- 14033:1433
Code language: YAML (yaml)
Note that, by default we are using the latest image of the SQL Server. MS SQL Server database has a root user ‘sa’ and in the above configuration we are setting a new password for the root user. Also, we are accepting the End User License Agreement. Lastly, we are forwarding the SQL Server default port (1433) to the 14033 port of our local machine.
~ docker-compose -f path/to/docker-compose.yml up -d
Code language: Bash (bash)
Now, we are starting the docker-compose file in a detached mode.
Creating network "sql-server-docker_default" with the default driver Pulling database (mcr.microsoft.com/mssql/server:)… latest: Pulling from mssql/server 345e3491a907: Pull complete 57671312ef6f: Pull complete 5e9250ddb7d0: Pull complete 1f9b20e23ebb: Pull complete e23afff1f9a0: Pull complete 83c8e0c0584e: Pull complete 17d57cdb8829: Pull complete Digest: sha256:51965e4e4c17e6fef087550190c2920c7ef91bd449d0eec06a5484b92c437767 Status: Downloaded newer image for mcr.microsoft.com/mssql/server:latest Creating ms-sql-server-latest … done
From the logs, we can see the MS SQL server image is downloaded and started in a container. We can verify by connecting to the database using the root user and its password.
Spring Boot + Spring Data JPA + SQL Server Application
Now, we have a locally accessible MS SQL Server database instance. Next, we will build our Spring Boot application from scratch. We already have a tutorial (CRUD REST Service With Spring Boot, Hibernate, and JPA tutorial) detailing on how to build a Spring Boot and Spring Data JPA based application. We recommend using the tutorial to get all the pre-requisites done.
Following the steps in the given tutorial, we have
- Created a Spring Boot web application.
- Added dependencies like spring-boot-starter-parent, spring-boot-starter-data-jpa, spring-boot-starter-web, and optionally the Lombok dependency.
- Created an Entity Bean class (Student) with an auto-incrementing primary key.
- Added a Spring Data Repository interface (StudentRepository).
- Created a Spring REST Controller (StudentController). Our StudentController has
POST /students
,PUT/students
,DELETE /students
,GET /students
, andGET /students/{studentId}
endpoints.
Next, we will add SQL Server Java Drivers dependency to our pom.xml or build.gradle files.
pom.xml
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
Code language: Java (java)
build.gradle
runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
Code language: Gradle (gradle)
SQL Sever Datasource Configuration
Spring Boot supports application properties based datasource config. As we know Spring Boot Auto-configuration refers to the dependencies and datasource configurations to automatically initialize all the essential components of Hibernate, and Spring Data JPA.
Thus, we only need to provide SQL Server driver name, database url, database username and the password.
spring:
datasource:
username: "sa"
password: "password" ##Enter your root password
url: "jdbc:sqlserver://localhost:14033"
driverClassName: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
Code language: YAML (yaml)
Prepare Schema and Initial Data
Additionally, we can also create a table and load initial data into the database. Our student service needs a student table with four columns.
With Spring Boot, we can put all of our schema creation scripts in schema.sql file and our data scripts inside data.sql file.
schema.sql
CREATE TABLE student
(
student_id INTEGER NOT NULL IDENTITY PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50),
year INTEGER
);
Code language: SQL (Structured Query Language) (sql)
Note that, the student_id
is a primary key and it is marked as IDENTITY. Thus the field value is auto-incrementing.
data.sql
INSERT INTO student (first_name, last_name, year) VALUES ('Jon', 'S', 2024);
INSERT INTO student (first_name, last_name, year) VALUES ('Khal', 'D', 2025);
INSERT INTO student (first_name, last_name, year) VALUES ('Belwas', 'S', 2029);
INSERT INTO student (first_name, last_name, year) VALUES ('Petyr', 'L', 2023);
Code language: SQL (Structured Query Language) (sql)
Here, we are inserting four student records in our newly created table.
Make sure these two files are placed under src/main/resources
directory.
Launch the Application
So far, we have covered all the required steps to launch and test our application. Start the application, manually by running the Application.java
or use Spring Boot Maven plugin to launch it.
~ mvn spring-boot:run
Code language: Bash (bash)
This command will build and launch the Spring Boot application.
INFO [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8084 (http) with context path ''
INFO [main] com.amitph.spring.data.Application : Started Application in 8.841 seconds (JVM running for 9.407)
INFO [main] o.s.b.a.ApplicationAvailabilityBean : Application availability state LivenessState changed to CORRECT
INFO [main] o.s.b.a.ApplicationAvailabilityBean : Application availability state ReadinessState changed to ACCEPTING_TRAFFIC
Code language: Bash (bash)
The logs show that our application is started and listening on the given port – 8084.
Summary
This was a quick tutorial to build a Spring Boot + Spring Data JPA + MS SQL Server web application from scratch. We created a dummy Students Service that persists the students records in a MS SQL Server instance and manages the persistence using Hibernate and Spring Data JPA. Also, the application exposes standard Create, Read, Update, and Delete actions on the students. Additionally, we covered how to launch a SQL Server instance in a docker container.
For full source of the examples used here, please visit our Github Repo – spring-boot-data-jpa-postgres.