Spring Boot MySQL CRUD Example

πŸŽ“ Top 15 Udemy Courses (80-90% Discount): My Udemy Courses - Ramesh Fadatare — All my Udemy courses are real-time and project oriented courses.

▶️ Subscribe to My YouTube Channel (178K+ subscribers): Java Guides on YouTube

▶️ For AI, ChatGPT, Web, Tech, and Generative AI, subscribe to another channel: Ramesh Fadatare on YouTube

In this tutorial, we will learn how to build CRUD RESTful API using Spring Boot 3, Spring Data JPA (Hibernate), and MySQL database.

CRUD stands for "create, read, update, and delete," which are the four basic functions of persistent storage. Spring Boot is a Java-based framework used to build web applications and RESTful APIs. Together, Spring Boot and CRUD can be used to quickly develop a RESTful API that can create, read, update, and delete data in a database.

Learn complete Spring boot at Learn and Master Spring Boot

Spring Boot Project Architecture

We are going to use three-layer architecture in our Spring boot project:


Tools and Technologies Used:

  • Spring Boot 3.0
  • Java 17
  • Spring Data JPA
  • Hibernate
  • MySQL Database
  • Maven
  • Postman

1. Create and Setup Spring Boot Project in IntelliJ

Spring Boot provides a web tool called Spring Initializer to create and bootstrap Spring boot applications quickly. Just go to https://start.spring.io/ and generate a new spring boot project.

Refer to this screenshot to enter the details to create the Spring Boot project:


Here is the pom.xml file for your reference:
<?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.0.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>net.javaguides</groupId>
	<artifactId>springboot-restful-webservices</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-restful-webservices</name>
	<description>Demo project for Spring Boot Restful Webservices</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Project Structure

Refer to this screenshot to create a project structure:
Let's first create a database, go to MySQL workbench, and use the below SQL query to create a new database:
create database user_management
Next, open the application.properties file and add the following properties to it.

spring.datasource.url=jdbc:mysql://localhost:3306/user_management
spring.datasource.username=root
spring.datasource.password=Mysql@123
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update

Make sure that you change the spring.datasource.username & spring.datasource.password properties as per your MySQL installation.

In the above properties file, the last two properties are for Hibernate. Spring Boot uses Hibernate as the default JPA implementation.

The property spring.jpa.hibernate.ddl-auto is used for database initialization. I’ve used the value “update” for this property to create the database tables automatically.

Create User JPA Entity

An Entity is a plain old Java object (POJO) that represents the data you want to store. You will need to annotate the class with @Entity and define the fields of the class along with the getters and setters for each field.

Let's create a User class and add the following content to it:
package net.javaguides.springboot.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "users")
public class User {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;
 @Column(nullable = false)
 private String firstName;
 @Column(nullable = false)
 private String lastName;
 @Column(nullable = false, unique = true)
 private String email;
}
Note that we are using Lombok annotations to reduce the boilerplate code (getters/setters).

Create Spring Data JPA Repository - UserRepository

A repository is an interface that defines the methods for performing CRUD operations on the Entity. Spring Data JPA will automatically create the implementation for the Repository interface.

Let's create a UserRepository interface that extends JpaRepository:
package net.javaguides.springboot.repository;
import net.javaguides.springboot.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
Note that we do not need to add @Repository annotation because Spring Data JPA internally takes care of it.

Create Service Layer

This layer will contain the business logic for the API and will be used to perform CRUD operations using the Repository.

Let's implement the service layer, we will first create an interface and then its implementation class.

Service Interface

Let's create an UserService interface and declare the following CRUD methods:

package net.javaguides.springboot.service;
import net.javaguides.springboot.entity.User;
import java.util.List;
public interface UserService {
 User createUser(User user);
 User getUserById(Long userId);
 List<User> getAllUsers();
 User updateUser(User user);
 void deleteUser(Long userId);
}

UserServiceImpl

Let's create UserServiceImpl class that implements UserService interface methods:

package net.javaguides.springboot.service.impl;
import lombok.AllArgsConstructor;
import net.javaguides.springboot.entity.User;
import net.javaguides.springboot.repository.UserRepository;
import net.javaguides.springboot.service.UserService;
import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {
 private UserRepository userRepository;
 @Override
 public User createUser(User user) {
 return userRepository.save(user);
 }
 @Override
 public User getUserById(Long userId) {
 Optional<User> optionalUser = userRepository.findById(userId);
 return optionalUser.get();
 }
 @Override
 public List<User> getAllUsers() {
 return userRepository.findAll();
 }
 @Override
 public User updateUser(User user) {
 User existingUser = userRepository.findById(user.getId()).get();
 existingUser.setFirstName(user.getFirstName());
 existingUser.setLastName(user.getLastName());
 existingUser.setEmail(user.getEmail());
 User updatedUser = userRepository.save(existingUser);
 return updatedUser;
 }
 @Override
 public void deleteUser(Long userId) {
 userRepository.deleteById(userId);
 }
}

Create Controller Layer - UserController

We’ll now create the REST APIs for creating, retrieving, updating, and deleting a User resource.

Let's create UserController class and let's build CRUD REST APIs for the User resource:
package net.javaguides.springboot.controller;
import lombok.AllArgsConstructor;
import net.javaguides.springboot.entity.User;
import net.javaguides.springboot.service.UserService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@AllArgsConstructor
@RequestMapping("api/users")
public class UserController {
 private UserService userService;
 // build create User REST API
 @PostMapping
 public ResponseEntity<User> createUser(@RequestBody User user){
 User savedUser = userService.createUser(user);
 return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
 }
 // build get user by id REST API
 // http://localhost:8080/api/users/1
 @GetMapping("{id}")
 public ResponseEntity<User> getUserById(@PathVariable("id") Long userId){
 User user = userService.getUserById(userId);
 return new ResponseEntity<>(user, HttpStatus.OK);
 }
 // Build Get All Users REST API
 // http://localhost:8080/api/users
 @GetMapping
 public ResponseEntity<List<User>> getAllUsers(){
 List<User> users = userService.getAllUsers();
 return new ResponseEntity<>(users, HttpStatus.OK);
 }
 // Build Update User REST API
 @PutMapping("{id}")
 // http://localhost:8080/api/users/1
 public ResponseEntity<User> updateUser(@PathVariable("id") Long userId,
 @RequestBody User user){
 user.setId(userId);
 User updatedUser = userService.updateUser(user);
 return new ResponseEntity<>(updatedUser, HttpStatus.OK);
 }
 // Build Delete User REST API
 @DeleteMapping("{id}")
 public ResponseEntity<String> deleteUser(@PathVariable("id") Long userId){
 userService.deleteUser(userId);
 return new ResponseEntity<>("User successfully deleted!", HttpStatus.OK);
 }
}

Running Spring Boot Application

Run the spring boot application from IDE:

From your IDE, run the SpringbootRestfulWebservicesApplication.main() method as a standalone Java class that will start the embedded Tomcat server on port 8080 and point the browser to http://localhost:8080/.

Run the spring boot application using the command line:

Just go to the root directory of the application and type the following command to run it -
$ mvn spring-boot:run

The application will start at Spring Boot’s default tomcat port 8080.

Test CRUD RESTful WebServices using Postman Client

Create User REST API:

HTTP Method: POST
Request Body:
{
 "firstName": "ramesh",
 "lastName":"fadatare",
 "email": "ramesh@gmail.com"
}
Refer to this screenshot to test Create User REST API:

Get User REST API:

HTTP Method: GET

Refer to this screenshot to test GET User REST API:

Update User REST API:

HTTP Method: PUT
Request Body:
{
 "firstName": "ram",
 "lastName":"fadatare",
 "email": "ram@gmail.com"
}
Refer to this screenshot to test the Update User REST API:

Get All Users REST API:

HTTP Method: GET

Refer to this screenshot to test GET All User REST API:

DELETE User REST API:

HTTP Method: DELETE

Refer to this screenshot to test Delete User REST API:

Source Code on GitHub

The source code of this tutorial is available on my GitHub repository at Spring Boot CRUD RESTful WebServices

Conclusion

In this tutorial, we have created a Spring boot project and built CRUD RESTful Webservices using Spring Boot 3, Spring Data JPA (Hibernate), and MySQL database.

Further Reading

Related Spring Boot and Microservices Tutorials/Guides:

The Hidden Magic of Spring Boot: Secrets Every Developer Should Know What Happens When You Hit a Spring Boot REST API Endpoint (Behind the Scenes) Spring Boot Exception Handling Build CRUD REST API with Spring Boot, Spring Data JPA, Hibernate, and MySQL Spring Boot DELETE REST API: @DeleteMapping Annotation Spring Boot PUT REST API — @PutMapping Annotation Spring Boot POST REST API Spring Boot GET REST API — @GetMapping Annotation Spring Boot REST API with Request Param | Spring Boot Course Spring Boot REST API with Path Variable — @PathVariable Chapter 13: Understanding @SpringBootApplication Annotation | Spring Boot Course Chapter 5: Create Spring Boot Project and Build Hello World REST API | Spring Boot Course 10 Real-World Spring Boot Architecture Tips Every Developer Should Follow Top 10 Spring Boot Tricks Every Java Developer Should Know Debugging Spring Dependency Injection Issues - Very Important Common Code Smells in Spring Applications — How to Fix Them Spring Boot + OpenAI ChatGPT API Integration Tutorial Spring Boot Course -> New Series on Medium ❤️ Spring Boot Microservices with RabbitMQ Example React JS + Spring Boot Microservices Dockerizing a Spring Boot Application How to Change the Default Port in Spring Boot How to Change Context Path in Spring Boot Top 10 Spring Boot REST API Mistakes and How to Avoid Them (2025 Update) Spring Boot REST API Best Practices Spring Boot Security Database Authentication Example Tutorial Spring Boot Security Form-Based Authentication Spring Boot Security In-Memory Authentication What is Spring Boot Really All About? Why Spring Boot over Spring? Top 10 Spring Boot Key Features That You Should Know Spring vs Spring Boot Setting Up the Development Environment for Spring Boot Spring Boot Auto-Configuration: A Quick Guide Spring Boot Starters Quick Guide to Spring Boot Parent Starter Spring Boot Embedded Servers Spring Boot Thymeleaf Hello World Example Chapter 10: Spring Boot DevTools | Spring Boot Course Chapter 13: Spring Boot REST API That Returns JSON | Spring Boot Course Spring Boot REST API That Returns List of Java Objects in JSON Format Top 10 Spring Boot Mistakes and How to Avoid Them Advanced Spring Boot Concepts that Every Java Developer Should Know What Are Microservices in Spring Boot? Integrating React Frontend with Spring Boot ChatGPT API (Step-by-Step Guide) Build a Chatbot Using Spring Boot, React JS, and ChatGPT API Top 10 Mistakes in Spring Boot Microservices and How to Avoid Them (With Examples) Spring Boot Security Best Practices: Protecting Your Application from Attacks πŸ”„ Dependency Injection in Spring (Explained with Coding Examples) ⚙️ How Spring Container Works Behind the Scenes How Spring Container Works Behind the Scenes (Spring Container Secrets Revealed!) Spring @Component vs @Bean vs @Service vs @Repository Explained How Component Scanning Works Behind the Scenes in Spring How Spring Autowiring Works Internally Top 20 Spring Boot Best Practices for Java Developers Build Spring Boot React Full Stack Project — Todo App [2025 Update] Spring vs Spring MVC vs Spring Boot Spring Boot Best Practices: Use DTOs Instead of Entities in API Responses Spring Boot DTO Tutorial (Using Java record) – Complete CRUD REST API Implementation Spring Boot Architecture: Controller, Service, Repository, Database and Architecture Flow Java Stream filter() Method with Real-World Examples Spring Boot Auto Configuration Explained | How It Works Spring Boot Profiles: How to Manage Environment-Based Configurations Create a Custom Spring Boot Starter | Step-by-Step Guide Spring Boot Starter Modules Explained | Auto-Configuration Guide Deploy Spring Boot Applications with Profile-Based Settings | Step-by-Step Guide Spring Boot Performance Tuning: 10 Best Practices for High Performance Spring Boot @ComponentScan Annotation | Customizing Component Scanning Difference Between @RestController and @RequestMapping in Spring Boot Spring Boot @Cacheable Annotation – Improve Performance with Caching Spring Boot Redis Cache — @Cacheable Complete Guide When to Use @Service, @Repository, @Controller, and @Component Annotations in Spring Boot Why, When, and How to Use @Bean Annotation in Spring Boot App Java Spring Boot vs. Go (Golang) for Backend Development in 2025 Is Autowired Annotation Deprecated in Spring Boot? Everything You Need to Know 🚫 Stop Making These Common Mistakes in Spring Boot Projects Top 10 Mind-Blowing Spring Boot Tricks for Beginners Why Choose Spring Boot Over Spring Framework? | Key Differences and Benefits How to Run a Spring Boot Application | 5 Easy Ways for Developers What is AutoConfiguration in Spring Boot? | Explained with Example Customize Default Configuration in Spring Boot | 5 Proven Ways Chapter 12: Understanding SpringApplication.run() Method Internals | Spring Boot Course What is CommandLineRunner in Spring Boot? How to Create Custom Bean Validation in Spring Boot Can You Build a Non-Web Application with Spring Boot? How to Disable Auto-Configuration in Spring Boot (Step-by-Step Guide) Top 25 Spring Boot Interview Questions and Answers for Beginners How to Use Java Records with Spring Boot Spring Boot Constructor Injection Explained with Step-by-Step Example 🚫 Stop Using @Transactional Everywhere: Understand When You Actually Need It 🚫 Stop Writing Fat Controllers: Follow the Controller-Service-Repository Pattern 🚫 Stop Using Field Injection in Spring Boot: Use Constructor Injection 🚫 Stop Sharing Databases Between Microservices: Use Database Per Service Pattern 10 Java Microservices Best Practices Every Developer Should Follow How to Choose the Right Java Microservices Communication Style (Sync vs Async) How to Implement Event-Driven Communication in Java Microservices (Step-by-Step Guide with Kafka) Stop Building Tight-Coupled Microservices: Aim for Loose Coupling Spring Boot Microservices E-Commerce Project: Step-by-Step Guide Spring Boot Microservices with RabbitMQ Example React JS + Spring Boot Microservices The Ultimate Microservices Roadmap for Beginners: Building Modern Scalable Systems What Are Microservices in Spring Boot? Top 5 Message Brokers Every Developer Should Know Top 10 Spring Cloud Microservices Best Practices [Removed Deprecated Features] Best Tools for Microservices Development in 2025 How to Break a Monolithic Application into Microservices (E-Commerce Use Case) Monoliths Aren’t Dead — Microservices Are Just Overused When to Break a Monolith: A Developer’s Checklist πŸ‘‘ Java Is Still the King of Microservices — And Here’s the Proof 5 Microservices Design Patterns You Must Know in 2025 Bulkhead Pattern in Microservices — Improve Resilience and Fault Isolation Strangler Fig Pattern in Microservices — Migrate Monolith to Microservices Event Sourcing Pattern in Microservices (With Real-World Example) Circuit Breaker Pattern in Microservices using Spring Boot 3, WebClient and Resilience4j CQRS Pattern in Microservices Aggregator Design Pattern in Microservices — A Complete Guide Database Per Service Pattern in Microservices API Gateway Pattern in Microservices — A Complete Guide Saga Pattern in Microservices: A Step-by-Step Guide Microservices Are a Mess Without These Java Design Patterns️ Java Microservices Interview Questions and Answers for Freshers Top Microservices Interview Questions and Answers for Experienced Professionals Top 10 Microservices Design Pattern Interview Questions and Answers Top Microservices Tricky Interview Questions You Should Know (With Answers) Microservices Best Practices: Building Scalable and Resilient Systems Why Microservices Are the Future of Software Architecture Microservices with Spring Cloud: Simplify Your Architecture Spring Boot and Microservices Roadmap for Beginners [2025 Update] Best Programming Language for Microservices Project Development in 2025 My 50+ Must-Read Microservices Tutorials, Articles and Guides on the Medium Platform
(追記) (θΏ½θ¨˜γ“γ“γΎγ§)

Comments

  1. Very nice step by step instructions. Loved your articles.

    Reply Delete
  2. Enjoyed learning. Thanks for the great tutorial.

    Reply Delete
  3. Excellent tutorial for beginners to quickly start spring boot application development.

    Reply Delete
  4. Thank you so much.. can you share your database file with me

    Reply Delete
    Replies
    1. You can get it from my Github repository, the link given at end of this tutorial. Cheers.

      Delete
  5. can you share your database file with me? there isnt in the github repo

    Reply Delete
  6. Hi sir, Please give the solution for below issue while implementing your application.
    Field employeeRepository in com.example.demofirst.controller.EmployeeController required a bean of type 'com.example.repository.EmployeeRepository' that could not be found.

    The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


    Action:

    Consider defining a bean of type 'com.example.repository.EmployeeRepository' in your configuration.

    Reply Delete
  7. Hi sir, Please give the solution for below issue while implementing your application.
    Field employeeRepository in com.example.demofirst.controller.EmployeeController required a bean of type 'com.example.repository.EmployeeRepository' that could not be found.

    The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


    Action:

    Consider defining a bean of type 'com.example.repository.EmployeeRepository' in your configuration.

    Reply Delete

Post a Comment

Leave Comment

[フレーム]

(追記) (θΏ½θ¨˜γ“γ“γΎγ§)
(追記) (θΏ½θ¨˜γ“γ“γΎγ§)
(追記) (θΏ½θ¨˜γ“γ“γΎγ§)

Spring Boot 3 Paid Course Published for Free
on my Java Guides YouTube Channel

[フレーム]

Subscribe to my YouTube Channel (165K+ subscribers):
Java Guides Channel

Top 10 My Udemy Courses with Huge Discount:
Udemy Courses - Ramesh Fadatare