Building Java RESTful Web Services Using Spring Boot, Spring Data JPA, and MySQL [2025 Edition]

Ramesh Fadatare
7 min readFeb 2, 2025

--

πŸš€ Learn how to develop RESTful web services using Spring Boot, Spring Data JPA, and MySQL. Test APIs using Postman and implement CRUD operations with best practices.

For non-members, read this article for free on my blog: Building RESTful Web Services Using Spring Boot, Spring Data JPA, and MySQL.

πŸ”Ή Introduction: Why Build REST APIs Using Spring Boot?

Spring Boot is one of the most popular Java frameworks for building scalable and efficient RESTful APIs. Using Spring Data JPA and MySQL, we can create database-backed web services with minimal configuration.

πŸ“Œ What You Will Learn

βœ… How to set up a Spring Boot project with MySQL.
βœ… How to create a REST API for CRUD operations.
βœ… How to use Spring Data JPA to interact with the database.
βœ… How to implement exception handling in a RESTful API.
βœ… How to test APIs using Postman.

I am a bestseller Udemy Instructor. Check out my top 10 Udemy courses with discounts: My Udemy Courses β€” Ramesh Fadatare.

πŸš€ Step 1: Set Up the Spring Boot Project

We will use Spring Initializr to generate the Spring Boot project.

1️⃣ Go to Spring Initializr.
2️⃣ Select the following options:

  • Project Type: Maven
  • Language: Java
  • Spring Boot Version: 3.x
  • Group: net.javaguides.usermanagement
  • Artifact: user-management
  • Dependencies:
    βœ… Spring Web (for building REST APIs)
    βœ… Spring Data JPA (for database interaction)
    βœ… MySQL Driver (for connecting to MySQL)
    βœ… Lombok (to reduce boilerplate code)

3️⃣ Click Generate and download the project.
4️⃣ Extract the zip file and open it in IntelliJ IDEA or VS Code.

Create a Packaging Structure:

πŸš€ Step 2: Configure MySQL Database

We need to configure MySQL as our database in the application.properties file.

πŸ“Œ Open src/main/resources/application.properties and add:

spring.application.name=user-management

spring.datasource.url=jdbc:mysql://localhost:3306/user_management
spring.datasource.username=root
spring.datasource.password=Password@123

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

πŸ“Œ Explanation

βœ”οΈ spring.datasource.url β†’ Defines the database connection URL.
βœ”οΈ spring.datasource.username & password β†’ Credentials for MySQL.
βœ”οΈ spring.jpa.hibernate.ddl-auto=update β†’ Automatically updates the schema based on entity changes.
βœ”οΈ spring.jpa.show-sql=true β†’ Enables SQL query logging for debugging.

πŸš€ Step 3: Create the User Entity

Spring Data JPA allows us to define database tables as Java classes using the @Entity annotation.

πŸ“Œ Create User.java inside net.javaguides.usermanagement.entity

package net.javaguides.usermanagement.entity;

import jakarta.persistence.*;
import java.time.LocalDate;

@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String firstName;
private String lastName;
private String email;
private LocalDate dateOfBirth;

// Getters and Setters
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public LocalDate getDateOfBirth() {
return dateOfBirth;
}

public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}

πŸš€ Step 4: Create the User Repository

Spring Data JPA provides JpaRepository, which includes methods for CRUD operations.

πŸ“Œ Create UserRepository.java inside net.javaguides.usermanagement.repository

package net.javaguides.usermanagement.repository;

import net.javaguides.usermanagement.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {}

βœ”οΈ Extends JpaRepository<User, Long> β†’ Provides built-in CRUD methods (save, findById, deleteById, etc.).

πŸš€ Step 5: Implement DTO and Mapper

Instead of exposing Entity classes, we use DTO (Data Transfer Object) to encapsulate and validate data.

πŸ“Œ Create UserDto.java inside net.javaguides.usermanagement.dto

package net.javaguides.usermanagement.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;

public record UserDto(
Long id,
String firstName,
String lastName,
String email,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
LocalDate dateOfBirth
) {}

πŸ“Œ Create UserMapper.java inside net.javaguides.usermanagement.mapper

package net.javaguides.usermanagement.mapper;

import net.javaguides.usermanagement.dto.UserDto;
import net.javaguides.usermanagement.entity.User;
import org.springframework.stereotype.Component;

@Component
public class UserMapper {
public UserDto toDto(User user) {
return new UserDto(
user.getId(),
user.getFirstName(),
user.getLastName(),
user.getEmail(),
user.getDateOfBirth()
);
}

public User toEntity(UserDto userDto) {
User user = new User();
user.setId(userDto.id());
user.setFirstName(userDto.firstName());
user.setLastName(userDto.lastName());
user.setEmail(userDto.email());
user.setDateOfBirth(userDto.dateOfBirth());
return user;
}
}

πŸš€ Step 6: Implement the Service Layer

πŸ“Œ Create ResourceNotFoundException.java inside net.javaguides.usermanagement.exception

package net.javaguides.usermanagement.exception;

public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}

πŸ“Œ Create UserService.java inside net.javaguides.usermanagement.service

package net.javaguides.usermanagement.service;

import net.javaguides.usermanagement.dto.UserDto;
import java.util.List;

public interface UserService {
UserDto createUser(UserDto userDto);
UserDto getUserById(Long id);
List<UserDto> getAllUsers();
UserDto updateUser(Long id, UserDto userDto);
void deleteUser(Long id);
}

πŸ“Œ Create UserServiceImpl.java inside net.javaguides.usermanagement.service.impl

πŸ“Œ Create UserServiceImpl.java inside net.javaguides.usermanagement.service.impl

package net.javaguides.usermanagement.service.impl;

import net.javaguides.usermanagement.dto.UserDto;
import net.javaguides.usermanagement.entity.User;
import net.javaguides.usermanagement.exception.ResourceNotFoundException;
import net.javaguides.usermanagement.mapper.UserMapper;
import net.javaguides.usermanagement.repository.UserRepository;
import net.javaguides.usermanagement.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final UserMapper userMapper;

public UserServiceImpl(UserRepository userRepository, UserMapper userMapper) {
this.userRepository = userRepository;
this.userMapper = userMapper;
}

@Override
public UserDto createUser(UserDto userDto) {
User user = userMapper.toEntity(userDto);
User savedUser = userRepository.save(user);
return userMapper.toDto(savedUser);
}

@Override
public UserDto getUserById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found with id: " + id));
return userMapper.toDto(user);
}

@Override
public List<UserDto> getAllUsers() {
return userRepository.findAll()
.stream()
.map(userMapper::toDto)
.collect(Collectors.toList());
}

@Override
public UserDto updateUser(Long id, UserDto userDto) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found with id: " + id));
user.setFirstName(userDto.firstName());
user.setLastName(userDto.lastName());
user.setEmail(userDto.email());
user.setDateOfBirth(userDto.dateOfBirth());
User updatedUser = userRepository.save(user);
return userMapper.toDto(updatedUser);
}

@Override
public void deleteUser(Long id) {
if (!userRepository.existsById(id)) {
throw new ResourceNotFoundException("User not found with id: " + id);
}
userRepository.deleteById(id);
}
}

Now that we have our User entity, DTO, service layer, and repository, we need to create a REST Controller to expose CRUD endpoints for managing users.

πŸš€ Step 7: Implement the REST Controller

We will create a UserController to handle HTTP requests.

πŸ“Œ Create UserController.java inside net.javaguides.usermanagement.controller

package net.javaguides.usermanagement.controller;

import net.javaguides.usermanagement.dto.UserDto;
import net.javaguides.usermanagement.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

private final UserService userService;

public UserController(UserService userService) {
this.userService = userService;
}

// Create User
@PostMapping
public ResponseEntity<UserDto> createUser(@RequestBody UserDto userDto) {
return ResponseEntity.ok(userService.createUser(userDto));
}

// Get User by ID
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}

// Get All Users
@GetMapping
public ResponseEntity<List<UserDto>> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}

// Update User
@PutMapping("/{id}")
public ResponseEntity<UserDto> updateUser(
@PathVariable Long id,
@RequestBody UserDto userDto) {
return ResponseEntity.ok(userService.updateUser(id, userDto));
}

// Delete User
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}

πŸ“Œ Explanation of UserController.java

βœ”οΈ @RestController β†’ Marks this class as a Spring REST Controller.
βœ”οΈ @RequestMapping("/api/users") β†’ All API routes start with /api/users.
βœ”οΈ @PostMapping β†’ Creates a new user.
βœ”οΈ @GetMapping("/{id}") β†’ Retrieves a user by ID.
βœ”οΈ @GetMapping β†’ Fetches all users.
βœ”οΈ @PutMapping("/{id}") β†’ Updates an existing user.
βœ”οΈ @DeleteMapping("/{id}") β†’ Deletes a user.

πŸš€ Step 8: Run the Spring Boot Application

πŸ“Œ Run the application using the following command:

mvn spring-boot:run

πŸ“Œ The server should start at:
πŸ‘‰ http://localhost:8080

πŸš€ Step 9: Test the APIs Using Postman

βœ… 1. Create a New User (POST Request)

πŸ“Œ POST Request URL:

http://localhost:8080/api/users

πŸ“Œ Request Body (JSON Format)

{
"firstName": "Ramesh",
"lastName": "Fadatare",
"email": "ramesh.fadatare@example.com",
"dateOfBirth": "1991-08-15"
}

πŸ“Œ Expected Response (201 Created)

{
"id": 2,
"firstName": "Ramesh",
"lastName": "Fadatare",
"email": "ramesh.fadatare@example.com",
"dateOfBirth": "1991-08-15"
}

βœ… 2. Get All Users (GET Request)

βœ… 3. Get User by ID (GET Request)

πŸ“Œ GET Request URL:

http://localhost:8080/api/users/1

βœ… 4. Update User (PUT Request)

πŸ“Œ PUT Request URL:

http://localhost:8080/api/users/1

πŸ“Œ Request Body (JSON Format)

Updating email and dateOfBirth fields.

{
"firstName": "Ramesh",
"lastName": "Fadatare",
"email": "ramesh.fadatare@gmail.com",
"dateOfBirth": "1991-08-25"
}

πŸ“Œ Expected Response (200 OK)

{
"firstName": "Ramesh",
"lastName": "Fadatare",
"email": "ramesh.fadatare@gmail.com",
"dateOfBirth": "1991-08-25"
}

βœ… 5. Delete User (DELETE Request)

πŸ“Œ DELETE Request URL:

http://localhost:8080/api/users/1

πŸ“Œ Expected Response (204 No Content)

(No content, meaning the user was deleted successfully)

🎯 Summary: What We Achieved

βœ”οΈ Set up a Spring Boot project with MySQL.
βœ”οΈ Created a User entity, DTO, and Mapper.
βœ”οΈ Implemented Spring Data JPA repository.
βœ”οΈ Developed a RESTful API with CRUD operations.
βœ”οΈ Tested the APIs using Postman.

πŸš€ Next Steps

Exception Handling in Spring Boot Application [2025 Edition]

πŸŽ‰ Congratulations! You have successfully built RESTful APIs with Spring Boot and MySQL! πŸš€πŸ”₯

I am a bestseller Udemy Instructor. Check out my top 10 Udemy courses with discounts: My Udemy Courses β€” Ramesh Fadatare.

--

--

No responses yet