Topic 004: Spring Boot CRUD REST API (models, repositories (DAO), services, controllers, DTOs, and security configuration)
Creating a Spring Boot CRUD REST API with Hibernate ORM involves several components: models, repositories (DAO), services, controllers, DTOs, and security configuration. Below is an example of how to set up a basic CRUD REST API for an Employee
entity using Spring Boot, Hibernate ORM, and Spring Security.
src
└── main
├── java
│ └── com
│ └── example
│ ├── controller
│ ├── dao
│ ├── dto
│ ├── model
│ ├── service
│ └── security
└── resources
└── application.properties
Create the Employee
entity class in the model
package.
package com.example.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Create the EmployeeRepository
interface in the dao
package.
package com.example.dao;
import com.example.model.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
Create the EmployeeDTO
class in the dto
package.
package com.example.dto;
public class EmployeeDTO {
private Long id;
private String name;
private Integer age;
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Create the EmployeeService
class in the service
package.
package com.example.service;
import com.example.dao.EmployeeRepository;
import com.example.dto.EmployeeDTO;
import com.example.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public List<EmployeeDTO> getAllEmployees() {
return employeeRepository.findAll().stream().map(this::convertToDTO).collect(Collectors.toList());
}
public EmployeeDTO getEmployeeById(Long id) {
return employeeRepository.findById(id).map(this::convertToDTO).orElse(null);
}
public EmployeeDTO createEmployee(EmployeeDTO employeeDTO) {
Employee employee = convertToEntity(employeeDTO);
return convertToDTO(employeeRepository.save(employee));
}
public EmployeeDTO updateEmployee(Long id, EmployeeDTO employeeDTO) {
if (employeeRepository.existsById(id)) {
Employee employee = convertToEntity(employeeDTO);
employee.setId(id);
return convertToDTO(employeeRepository.save(employee));
}
return null;
}
public void deleteEmployee(Long id) {
employeeRepository.deleteById(id);
}
private EmployeeDTO convertToDTO(Employee employee) {
EmployeeDTO employeeDTO = new EmployeeDTO();
employeeDTO.setId(employee.getId());
employeeDTO.setName(employee.getName());
employeeDTO.setAge(employee.getAge());
employeeDTO.setEmail(employee.getEmail());
return employeeDTO;
}
private Employee convertToEntity(EmployeeDTO employeeDTO) {
Employee employee = new Employee();
employee.setName(employeeDTO.getName());
employee.setAge(employeeDTO.getAge());
employee.setEmail(employeeDTO.getEmail());
return employee;
}
}
Create the EmployeeController
class in the controller
package.
package com.example.controller;
import com.example.dto.EmployeeDTO;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
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;
@GetMapping
public List<EmployeeDTO> getAllEmployees() {
return employeeService.getAllEmployees();
}
@GetMapping("/{id}")
public ResponseEntity<EmployeeDTO> getEmployeeById(@PathVariable Long id) {
EmployeeDTO employeeDTO = employeeService.getEmployeeById(id);
if (employeeDTO != null) {
return new ResponseEntity<>(employeeDTO, HttpStatus.OK);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@PostMapping
public ResponseEntity<EmployeeDTO> createEmployee(@RequestBody EmployeeDTO employeeDTO) {
EmployeeDTO createdEmployee = employeeService.createEmployee(employeeDTO);
return new ResponseEntity<>(createdEmployee, HttpStatus.CREATED);
}
@PutMapping("/{id}")
public ResponseEntity<EmployeeDTO> updateEmployee(@PathVariable Long id, @RequestBody EmployeeDTO employeeDTO) {
EmployeeDTO updatedEmployee = employeeService.updateEmployee(id, employeeDTO);
if (updatedEmployee != null) {
return new ResponseEntity<>(updatedEmployee, HttpStatus.OK);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteEmployee(@PathVariable Long id) {
employeeService.deleteEmployee(id);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
Create a security configuration class in the security
package.
package com.example.security;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.httpBasic();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Configure the database in application.properties
.
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect