Spring Boot——增删查改(1)

Spring Boot增删查改

标签: SpringBoot


增删查改是最为基础的功能,在很多场景下都有运用。本文对增删查改功能进行简单的编写,满足一定的题目需求。

题目设置

本题要求使用Spring boot来完成对Employee CURD(增删改查) API接口的实现。

  • 要求每一个Employee包含idnameagegender四个字段。
  • 至少需要完成查询所有Employee 的API接口,并返回一个包含所有Employee的JSON,要求接口路径:http://localhost:8080/employees
  • 要求使用Postman来向目标接口路径发送请求,获取Response,Response JSON格式如下:
[
    {
      "id": 0,
      "name": "小明",
      "age": 20,
      "gender": "男"
    },
    {
      "id": 1,
      "name": "小红",
      "age": 19,
      "gender": "女"  
    },
    {
      "id": 2,
      "name": "小智",
      "age": 15,
      "gender": "男"
    },
    {
      "id": 3,
      "name": "小刚",
      "age": 16,
      "gender": "男"
    },
    {
      "id": 4,
      "name": "小霞",
      "age": 15,
      "gender": "女"
    }
  ]
  • 将结果截图并回复
  • 完成增删查改的所有接口

环境描述

  • java8
  • Intellij-IDEA
  • Linux

模型介绍

使用Spring Boot来进行开发,可以参照三层模型:DAO、Service和Controller层。下面,对这三层的意义的作用进行介绍。

  • DAO:DAO层主要是做数据持久层的工作,负责与数据库进行联络的任务封装于此。通常情况下,会先设计DAO的接口,然后,定义此接口的实现类。最后,可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪一个。
  • Service:Service层主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的DAO层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
  • Controller:Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。

程序设计

我们采用的是gradle5.2.1的版本,build.gradle文件如下配置:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

首先对实体进行定义:

//Employee.java
package com.thoughtworks.employee;

public class Employee {
    public Employee(){

    }

    public Employee(int id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    private int id;
    private String name;
    private int age;
    private String gender;
}

包括id,姓名,年龄和性别信息。

1. DAO层设计

首先是DAO层接口设计:

//IEmployeeDao.java
package com.thoughtworks.employee;

import java.util.List;

public interface IEmployeeDao {

    Employee getEmployeeByName(Integer id);
    List getEmployeeList();
    String addEmployee(Employee employee);
    String updateEmployee(Integer id, Employee employee);
    String deleteEmployee(Integer id);
}

为了简单起见,我们不采用数据库来存储Employee的信息,而是采用Map来存储。在DAO层的接口中,我们定义了五种成员方法,他们对应了五种不同的操作:1)使用Id来查找姓名,2)获得所有Employee成员信息,3)添加Employee成员,4)更新成员,5)删除成员。DAO层接口的实现类如下所示:

//EmployeeDao.java
package com.thoughtworks.employee;

import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class EmployeeDao implements IEmployeeDao{

    public EmployeeDao() {}

    private static Map employees = new HashMap<>();

    static {
        Employee e0 = new Employee(0,"小明",20,"男");
        Employee e1 = new Employee(1,"小红",19,"女");
        Employee e2 = new Employee(2,"小智",15,"男");
        Employee e3 = new Employee(3,"小刚",16,"男");
        Employee e4 = new Employee(4,"小霞",15,"女");
        employees.put(e0.getId(),e0);
        employees.put(e1.getId(),e1);
        employees.put(e2.getId(),e2);
        employees.put(e3.getId(),e3);
        employees.put(e4.getId(),e4);
    }

    @Override
    public Employee getEmployeeByName(Integer id) {
        return employees.get(id);
    }

    @Override
    public List getEmployeeList() {
        List employeeList = new ArrayList<>(employees.values());
        return employeeList;
    }

    @Override
    public String addEmployee(Employee employee) {
        employees.put(employee.getId(),employee);
        return "success";
    }

    @Override
    public String updateEmployee(Integer id, Employee employee) {
        employees.get(id).setName(employee.getName());
        employees.get(id).setAge(employee.getAge());
        employees.get(id).setGender(employee.getGender());
        return "success";
    }

    @Override
    public String deleteEmployee(Integer id) {
        employees.remove(id);
        return "success";
    }
}

使用注解@Repository来标记。

Service层设计

//IDataService.java
package com.thoughtworks.employee;

import java.util.List;

public interface IDataServices {
    Employee getEmployeeByName(Integer id);
    List getEmployeeList();
    String addEmployee(Employee employee);
    String updateEmployee(Integer id, Employee employee);
    String deleteEmployee(Integer id);
}
//DataService.java
package com.thoughtworks.employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DataServices implements IDataServices{
    @Autowired
    private EmployeeDao employeeDao;

    @Override
    public Employee getEmployeeByName(Integer id) {
        return employeeDao.getEmployeeByName(id);
    }

    @Override
    public List getEmployeeList() {
        return employeeDao.getEmployeeList();
    }

    @Override
    public String addEmployee(Employee employee) {
        return employeeDao.addEmployee(employee);
    }

    @Override
    public String updateEmployee(Integer id, Employee employee) {
        return employeeDao.updateEmployee(id,employee);
    }

    @Override
    public String deleteEmployee(Integer id) {
        return employeeDao.deleteEmployee(id);
    }
}

使用注解@Autowired来注明调用Employee的实例化部分。

Controller层设计

//EmployeeController.java
package com.thoughtworks.employee;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping(value = "/employees")
public class EmployeeController {
    @Autowired
    private DataServices dataServices;

    @RequestMapping(value = "/",method = RequestMethod.GET)
    public List getEmployeeList() {
        return dataServices.getEmployeeList();
    }

    @RequestMapping(value = "/", method = RequestMethod.POST)
    public String postEmployee(@RequestBody Employee employee) {
        return dataServices.addEmployee(employee);
    }

    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public Employee getEmployee(@PathVariable Integer id) {
        return dataServices.getEmployeeByName(id);
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public String putEmployee(@PathVariable Integer id, @RequestBody Employee employee) {
        return dataServices.updateEmployee(id,employee);
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public String deleteEmployee(@PathVariable Integer id) {
        return dataServices.deleteEmployee(id);
    }
}

你可能感兴趣的:(Spring Boot——增删查改(1))