11. REST CRUD Implementation & Production Patterns

REST Mapping & CRUD Operations

Master REST endpoint mapping, HTTP verbs, @PathVariable, @RequestBody, Create/Read/Update pipelines, and end-to-end request-to-database execution chains.

REST Mapping & CRUD Operations

CRUD mapping maps HTTP verbs directly to persistence operations on resources exposed by Spring MVC @RestController endpoints.


1. REST Endpoint Mapping Matrix

CRUD OperationHTTP MethodEndpoint URI@PathVariable / @RequestBodyAction
CreatePOST/api/students@RequestBody StudentCreates a new record in database
Read AllGET/api/studentsNoneReturns list of active records
Read OneGET/api/students/{id}@PathVariable Long idReturns single record by ID
UpdatePUT/api/students/{id}@PathVariable Long id, @RequestBody StudentUpdates existing record by ID
DeleteDELETE/api/students/{id}@PathVariable Long idRemoves or soft-deletes record

2. @PathVariable & @RequestBody Mechanics

HTTP Request:
PUT /api/students/42
Content-Type: application/json

Payload: { "name": "Rahul Sharma", "email": "[email protected]", "course": "Spring Boot", "age": 23, "rollNo": 101 }
       │                                                                                             │
       │ URL path variable "42"                                                                      │ Request body JSON
       ▼                                                                                             ▼
@PutMapping("/{id}")                                                                          @RequestBody
public Student update(@PathVariable Long id,                                                 Student student)

3. Step-by-Step CRUD Layer Implementations

Repository Layer Interface

Spring Data JPA provides ready-made CRUD methods (save(), findAll(), findById(), deleteById()):

package com.coderarmy.studentcrud.repository;

import com.coderarmy.studentcrud.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface StudentRepository extends JpaRepository<Student, Long> {
    // Custom query method for active (non-deleted) records
    List<Student> findByIsDeletedFalse();
}

Create Operation (POST /api/students)

// Controller
@PostMapping
public Student createStudent(@RequestBody Student student) {
    return studentService.createStudent(student);
}

// Service
public Student createStudent(Student student) {
    return studentRepository.save(student);
}

Read Operations (GET /api/students & GET /api/students/{id})

// Controller
@GetMapping
public List<Student> getAllStudents() {
    return studentService.getAllStudents();
}

@GetMapping("/{id}")
public Student getStudentById(@PathVariable Long id) {
    return studentService.getStudentById(id);
}

// Service
public List<Student> getAllStudents() {
    return studentRepository.findByIsDeletedFalse();
}

public Student getStudentById(Long id) {
    return studentRepository.findById(id)
            .filter(student -> !student.isDeleted())
            .orElseThrow(() -> new RuntimeException("Student not found with ID: " + id));
}

Update Operation (PUT /api/students/{id})

The update workflow follows 3 distinct steps:

  1. Find existing entity by ID (throw 404/Exception if missing).
  2. Mutate fields with incoming payload values.
  3. Save updated entity back into database.
// Controller
@PutMapping("/{id}")
public Student updateStudent(@PathVariable Long id, @RequestBody Student incoming) {
    return studentService.updateStudent(id, incoming);
}

// Service
public Student updateStudent(Long id, Student incoming) {
    Student existing = getStudentById(id); // Step 1: Find existing

    // Step 2: Mutate fields
    existing.setName(incoming.getName());
    existing.setEmail(incoming.getEmail());
    existing.setCourse(incoming.getCourse());
    existing.setAge(incoming.getAge());
    existing.setRollNo(incoming.getRollNo());

    // Step 3: Persist changes
    return studentRepository.save(existing);
}

4. End-to-End Request Execution Pipeline

1. Postman / Client sends HTTP POST /api/students JSON Payload


2. Tomcat receives raw TCP bytes and routes to DispatcherServlet


3. DispatcherServlet inspects URL mapping and selects StudentController


4. Jackson JSON deserializes request body into Student entity object


5. StudentController passes Student object to StudentService.createStudent()


6. StudentService applies validation rules and invokes StudentRepository.save()


7. Hibernate ORM generates SQL: INSERT INTO students (name, email, ...) VALUES (...)


8. mysql-connector-j sends SQL command across TCP socket to MySQL Server


9. MySQL Server executes insert, updates primary key index, and returns auto-generated ID


10. Entity returned back up stack: Database ──► Repository ──► Service ──► Controller ──► Response JSON

❓ Knowledge Check

Knowledge Check

Which annotation extracts a template variable from the URL path, such as extracting '42' from GET /api/students/42?

Knowledge Check

What are the three essential steps in executing an HTTP PUT update operation in Spring Boot?

On this page