About
Building a CRUD API Using Hibernate with Spring Boot
Maven Dependencies
Add these dependencies in our pom.xml
:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter for JPA (includes Hibernate) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL Connector (or any DB you use) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Optional: Lombok to reduce boilerplate -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
Application Properties File (Hibernate + DB Settings)
# Datasource properties
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=your_password
# JPA + Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
# Server port (optional)
server.port=8080
Entity Class
Employee.java
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "employees")
@Getter
@Setter
@NoArgsConstructor
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String email;
}
Repository Interface
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
Extending JpaRepository
provides ready-to-use methods like save()
, findById()
, findAll()
, deleteById()
, etc.
Service Layer
Service Interface:
import java.util.List;
public interface EmployeeService {
Employee createEmployee(Employee employee);
Employee getEmployeeById(Long id);
List<Employee> getAllEmployees();
Employee updateEmployee(Long id, Employee employee);
void deleteEmployee(Long id);
}
Service Implementation:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
@Override
public Employee createEmployee(Employee employee) {
return employeeRepository.save(employee);
}
@Override
public Employee getEmployeeById(Long id) {
return employeeRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Employee not found with id " + id));
}
@Override
public List<Employee> getAllEmployees() {
return employeeRepository.findAll();
}
@Override
public Employee updateEmployee(Long id, Employee employeeDetails) {
Employee employee = getEmployeeById(id);
employee.setFirstName(employeeDetails.getFirstName());
employee.setLastName(employeeDetails.getLastName());
employee.setEmail(employeeDetails.getEmail());
return employeeRepository.save(employee);
}
@Override
public void deleteEmployee(Long id) {
employeeRepository.deleteById(id);
}
}
Controller Layer (REST API)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping
public ResponseEntity<Employee> createEmployee(@RequestBody Employee employee) {
return ResponseEntity.ok(employeeService.createEmployee(employee));
}
@GetMapping("/{id}")
public ResponseEntity<Employee> getEmployeeById(@PathVariable Long id) {
return ResponseEntity.ok(employeeService.getEmployeeById(id));
}
@GetMapping
public ResponseEntity<List<Employee>> getAllEmployees() {
return ResponseEntity.ok(employeeService.getAllEmployees());
}
@PutMapping("/{id}")
public ResponseEntity<Employee> updateEmployee(@PathVariable Long id, @RequestBody Employee employee) {
return ResponseEntity.ok(employeeService.updateEmployee(id, employee));
}
@DeleteMapping("/{id}")
public ResponseEntity<String> deleteEmployee(@PathVariable Long id) {
employeeService.deleteEmployee(id);
return ResponseEntity.ok("Employee deleted successfully");
}
}
Main Application Class
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HibernateSpringBootCrudApplication {
public static void main(String[] args) {
SpringApplication.run(HibernateSpringBootCrudApplication.class, args);
}
}
Testing the API
Operation
HTTP Method
URL
Body (JSON)
{ "firstName": "John", "lastName": "Doe", "email": "john.doe@example.com" }
{ "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@example.com" }