REST Architecture Overview
REST (REpresentational State Transfer) is a software architectural style commonly used for web services.
/* APIResponse.java */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class APIResponse {
private Integer status; // Status code: 1 for success, 0 for failure
private String message; // Response message: descriptive string
private Object payload; // Response data
/**
* Success response for create, update, and delete operations
*/
public static APIResponse success() {
return new APIResponse(1, "Operation successful", null);
}
/**
* Success response for query operations
*/
public static APIResponse success(Object data) {
return new APIResponse(1, "Operation successful", data);
}
/**
* Error response
*/
public static APIResponse error(String message) {
return new APIResponse(0, message, null);
}
}
Department Management
A complete request path consists of the value attribute from class-level @RequestMapping plus the value attribute from method-level @RequestMapping.
@RequestMapping has specialized annotations such as @GetMapping, @PostMapping, @DeleteMapping, etc.
Add @Slf4j annotation to classes to automatically generate logging variables.
/* DepartmentController.java */
@Slf4j
@RestController
@RequestMapping("/api/departments")
public class DepartmentController {
@Autowired
private DepartmentService departmentService;
...
/* DepartmentService.java */
@Service
public interface DepartmentService {
... }
/* DepartmentServiceImpl.java */
@Service
public class DepartmentServiceImpl implements DepartmentService {
@Autowired
private DepartmentMapper departmentMapper;
...
/* DepartmentMapper.java */
@Mapper
public interface DepartmentMapper {
... }
/* Department.java */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Department {
private Integer id;
private String departmentName;
private LocalDateTime creationTime;
private LocalDateTime modificationTime;
}
2.1 Retrieving Departments
/* DepartmentController.java */
@GetMapping
public APIResponse getAllDepartments() {
log.info("Fetching all department records");
List departmentList = departmentService.getAllDepartments();
return APIResponse.success(departmentList);
}
/* DepartmentService.java */
List getAllDepartments();
/* DepartmentServiceImpl.java */
@Override
public List getAllDepartments() {
return departmentMapper.selectAllDepartments();
}
/* DepartmentMapper.java */
@Select("SELECT * FROM department")
public List selectAllDepartments();
2.2 Deleting a Department
/* DepartmentController.java */
@DeleteMapping("/{id}")
public APIResponse removeDepartment(@PathVariable Integer id) {
log.info("Deleting department with ID: {}", id);
departmentService.deleteDepartment(id);
return APIResponse.success();
}
/* DepartmentService.java */
void deleteDepartment(Integer id);
/* DepartmentServiceImpl.java */
@Override
public void deleteDepartment(Integer id) {
departmentMapper.removeById(id);
}
/* DepartmentMapper.java */
@Delete("DELETE FROM department WHERE id = #{id}")
void removeById(Integer id);
Implementation to delete all employees under this department will be added later.
2.3 Adding a Department
/* DepartmentController.java */
@PostMapping
public APIResponse createDepartment(@RequestBody Department department) {
log.info("Adding new department: {}", department);
departmentService.addDepartment(department);
return APIResponse.success();
}
/* DepartmentService.java */
void addDepartment(Department department);
/* DepartmentServiceImpl.java */
@Override
public void addDepartment(Department department) {
department.setCreationTime(LocalDateTime.now());
department.setModificationTime(LocalDateTime.now());
departmentMapper.insertDepartment(department);
}
/* DepartmentMapper.java */
@Insert("INSERT INTO department (department_name, creation_time, modification_time) VALUES (#{departmentName}, #{creationTime}, #{modificationTime})")
void insertDepartment(Department department);
2.4 Updating a Department
Frontend requires two endpoints: retrieve department by ID and update department.
/* DepartmentController.java */
@GetMapping("/{id}")
public APIResponse getDepartmentById(@PathVariable Integer id) {
log.info("Retrieving department with ID: {}", id);
Department department = departmentService.getDepartmentById(id);
return APIResponse.success(department);
}
/* DepartmentController.java */
@PutMapping
public APIResponse modifyDepartment(@RequestBody Department department) {
log.info("Updating department: {}", department);
departmentService.updateDepartment(department);
return APIResponse.success();
}
/* DepartmentService.java */
Department getDepartmentById(Integer id);
void updateDepartment(Department department);
/* DepartmentServiceImpl.java */
@Override
public Department getDepartmentById(Integer id) {
return departmentMapper.selectById(id);
}
@Override
public void updateDepartment(Department department) {
department.setModificationTime(LocalDateTime.now());
departmentMapper.updateDepartment(department);
}
/* DepartmentMapper.java */
@Select("SELECT * FROM department WHERE id = #{id}")
Department selectById(Integer id);
@Update("UPDATE department SET department_name = #{departmentName}, modification_time = #{modificationTime} WHERE id = #{id}")
void updateDepartment(Department department);
Employee Management
/* EmployeeController.java */
@Slf4j
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
...
/* EmployeeService.java */
@Service
public interface EmployeeService {
... }
/* EmployeeServiceImpl.java */
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
...
/* EmployeeMapper.java */
@Mapper
public interface EmployeeMapper {
... }