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<Employee> 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<Integer,Employee> 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<Employee> getEmployeeList() {
        List<Employee> 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<Employee> 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<Employee> 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<Employee> 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);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容