0


SpringBootWeb增删改查入门案例

前言

为了快速入门一个SpringBootWeb项目,这里就将基础的增删改查的案例进行总结,作为对SpringBoot+Mybatis的基础用法的一个巩固。

准备工作

  1. 需求说明 对员工表进行增删改查操作
  2. 环境搭建
  • 准备数据表
  1. -- 员工管理(带约束)
  2. create table emp (
  3. id int unsigned primary key auto_increment comment 'ID',
  4. username varchar(20) not null unique comment '用户名',
  5. password varchar(32) default '123456' comment '密码',
  6. name varchar(10) not null comment '姓名',
  7. gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
  8. image varchar(300) comment '图像',
  9. job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
  10. entrydate date comment '入职时间',
  11. dept_id int unsigned comment '部门ID',
  12. create_time datetime not null comment '创建时间',
  13. update_time datetime not null comment '修改时间'
  14. ) comment '员工表';
  15. -- 员工表测试数据
  16. INSERT INTO emp
  17. (id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
  18. (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
  19. (2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
  20. (3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
  21. (4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
  22. (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
  23. (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
  24. (7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
  25. (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
  26. (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
  27. (10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
  28. (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
  29. (12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
  30. (13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
  31. (14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
  32. (15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
  33. (16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),
  34. (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
  • 创建springboot工程,引入对应的起步依赖(web、mybatis、mysql驱动、lombok)在这里插入图片描述
  • 配置文件application.properties中引入mybatis的配置信息,准备对应的实体类- application.properties#数据库连接spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/tliasspring.datasource.username=rootspring.datasource.password=1234#开启mybatis的日志输出mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#开启数据库表字段 到 实体类属性的驼峰映射mybatis.configuration.map-underscore-to-camel-case=true- 实体类/*员工类*/@Data@NoArgsConstructor@AllArgsConstructorpublic class Emp { private Integer id; private String username; private String password; private String name; private Short gender; private String image; private Short job; private LocalDate entrydate; private Integer deptId; private LocalDateTime createTime; private LocalDateTime updateTime;}
  • 准备对应的Mapper、Service(接口、实现类)、Controller基础结构数据访问层:- EmpMapperimport org.apache.ibatis.annotations.Mapper;@Mapperpublic interface EmpMapper {}业务层:- EmpService//员工业务规则public interface EmpService {}- EmpServiceImplimport com.exmaple.service.EmpService;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;//员工业务实现类@Slf4j@Servicepublic class EmpServiceImpl implements EmpService {}控制层:- EmpControllerpackage com.exmple.controller;import org.springframework.web.bind.annotation.RestController;//员工管理控制器@RestControllerpublic class EmpController {}
  1. 开发规范
  • REST- 传统URL和REST风格比较 (1)传统URL风格http://localhost:8080/user/getById?id=1 GET:查询id为1的用户http://localhost:8080/user/saveUser POST:新增用户http://localhost:8080/user/updateUser POST:修改用户http://localhost:8080/user/deleteUser?id=1 GET:删除id为1的用户(2)REST风格URL:http://localhost:8080/users/1 GET:查询id为1的用户http://localhost:8080/users POST:新增用户http://localhost:8080/users PUT:修改用户http://localhost:8080/users/1 DELETE:删除id为1的用户> 其中总结起来,就一句话:通过URL定位要操作的资源,通过HTTP动词(请求方式)来描述具体的操作。在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。- GET : 查询- POST :新增- PUT :修改- DELETE :删除
  • 统一响应结果前后端工程在进行交互时,使用统一响应结果 Result。package com.example.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class Result { private Integer code;//响应码,1 代表成功; 0 代表失败 private String msg; //响应信息 描述字符串 private Object data; //返回的数据 //增删改 成功响应 public static Result success(){ return new Result(1,"success",null); } //查询 成功响应 public static Result success(Object data){ return new Result(1,"success",data); } //失败响应 public static Result error(String msg){ return new Result(0,msg,null); }}
  1. 开发流程
  • 查看页面原型明确需求- 根据页面原型和需求,进行表结构设计、编写接口文档(已提供)
  • 阅读接口文档
  • 思路分析
  • 功能接口开发- 就是开发后台的业务功能,一个业务功能,我们称为一个接口
  • 功能接口测试- 功能开发完毕后,先通过Postman进行功能接口测试,测试通过后,再和前端进行联调测试
  • 前后端联调测试- 和前端开发人员开发好的前端工程一起测试

新增员工

  1. 需求 在新增用户时,我们需要保存用户的基本信息,并且还需要上传的员工的图片,目前我们先完成第一步操作,保存用户的基本信息。
  2. 接口文档

我们参照接口文档来开发新增员工功能

  • 基本信息
  1. 请求路径:/emps
  2. 请求方式:POST
  3. 接口描述:该接口用于添加员工的信息
  • 请求参数 参数格式:application/json参数说明:名称类型是否必须备注usernamestring必须用户名namestring必须姓名gendernumber必须性别, 说明: 1 男, 2 女imagestring非必须图像deptIdnumber非必须部门identrydatestring非必须入职日期jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师请求数据样例:{ "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg", "username": "linpingzhi", "name": "林平之", "gender": 1, "job": 1, "entrydate": "2022-09-18", "deptId": 1}
  • 响应数据参数格式:application/json参数说明:参数名类型是否必须备注codenumber必须响应码,1 代表成功,0 代表失败msgstring非必须提示信息dataobject非必须返回的数据
  1. 思路分析 接口文档规定:- 请求路径:/emps- 请求方式:POST- 请求参数:Json格式数据- 响应数据:Json格式数据问题1:如何限定请求方式是POST?@PostMapping问题2:怎么在controller中接收json格式的请求参数?@RequestBody//把前端传递的json数据填充到实体类中
  2. 功能开发 EmpController
  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/emps")
  4. public class EmpController {
  5. @Autowired
  6. private EmpService empService;
  7. //新增
  8. @PostMapping
  9. public Result save(@RequestBody Emp emp){
  10. //记录日志
  11. log.info("新增员工, emp:{}",emp);
  12. //调用业务层新增功能
  13. empService.save(emp);
  14. //响应
  15. return Result.success();
  16. }
  17. //省略...
  18. }

EmpService

  1. public interface EmpService {
  2. /**
  3. * 保存员工信息
  4. * @param emp
  5. */
  6. void save(Emp emp);
  7. //省略...
  8. }

EmpServiceImpl

  1. @Slf4j
  2. @Service
  3. public class EmpServiceImpl implements EmpService {
  4. @Autowired
  5. private EmpMapper empMapper;
  6. @Override
  7. public void save(Emp emp) {
  8. //补全数据
  9. emp.setCreateTime(LocalDateTime.now());
  10. emp.setUpdateTime(LocalDateTime.now());
  11. //调用添加方法
  12. empMapper.insert(emp);
  13. }
  14. //省略...
  15. }

EmpMapper

  1. @Mapper
  2. public interface EmpMapper {
  3. //新增员工
  4. @Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
  5. "values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime});")
  6. void insert(Emp emp);
  7. //省略...
  8. }

删除员工

  1. 需求 前端页面可以一次性删除一个或多个员工。 问题:我们需要开发两个功能接口吗?一个删除单个员工,一个删除多个员工 答案:不需要。 只需要开发一个功能接口即可(删除多个员工包含只删除一个员工)
  2. 接口文档
  • 基本信息请求路径:/emps/{ids}请求方式:DELETE接口描述:该接口用于批量删除员工的数据信息
  • 请求参数 参数格式:路径参数参数说明:参数名类型示例是否必须备注ids数组 array1,2,3必须员工的id数组请求参数样例:/emps/1,2,3
  • 响应数据参数格式:application/json参数说明:参数名类型是否必须备注codenumber必须响应码,1 代表成功,0 代表失败msgstring非必须提示信息dataobject非必须返回的数据响应数据样例:{"code":1,"msg":"success","data":null}
  1. 思路分析 接口文档规定:
  • 前端请求路径:/emps/{ids}
  • 前端请求方式:DELETE问题1:怎么在controller中接收请求路径中的路径参数?@PathVariable问题2:如何限定请求方式是delete?@DeleteMapping问题3:在Mapper接口中,执行delete操作的SQL语句时,条件中的id值是不确定的是动态的,怎么实现呢?Mybatis中的动态SQL:foreach
  1. 功能开发EmpController@Slf4j@RestController@RequestMapping("/emps")publicclassEmpController{@AutowiredprivateEmpService empService;//批量删除@DeleteMapping("/{ids}")publicResultdelete(@PathVariableList<Integer> ids){ empService.delete(ids);returnResult.success();}}EmpServicepublicinterfaceEmpService{/** * 批量删除操作 * @param ids id集合 */voiddelete(List<Integer> ids);//省略...}EmpServiceImpl@Slf4j@ServicepublicclassEmpServiceImplimplementsEmpService{@AutowiredprivateEmpMapper empMapper;@Overridepublicvoiddelete(List<Integer> ids){ empMapper.delete(ids);}//省略...}EmpMapper@MapperpublicinterfaceEmpMapper{//批量删除voiddelete(List<Integer> ids);//省略...}EmpMapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.example.mapper.EmpMapper"><!--批量删除员工--><selectid="delete"> delete from emp where id in <foreachcollection="ids"item="id"open="("close=")"separator=","> #{id} </foreach></select><!-- 省略... --></mapper>> 元素用于迭代传入的集合。在这个例子中,它用于构建IN子句中的值列表。> collection属性:指定要迭代的集合名称。在这个例子中,collection="ids"意味着传入的参数应该是一个名为ids的集合。> item属性:指定每次迭代时使用的变量名。在这里,item=“id"表示每次迭代时,当前元素会被赋值给变量id。> open属性:指定循环产生的SQL片段的开头字符。在这里,open=”(“表示循环开始时添加一个左括号。> close属性:指定循环产生的SQL片段的结尾字符。在这里,close=”)“表示循环结束时添加一个右括号。> separator属性:指定每次迭代之间使用的分隔符。在这里,separator=”,"表示每次迭代之间添加一个逗号。

修改员工

  1. 需求 修改员工信息
  2. 接口文档- 基本信息请求路径:/emps请求方式:PUT接口描述:该接口用于修改员工的数据信息- 请求参数参数格式:application/json参数说明:名称类型是否必须备注idnumber必须idusernamestring必须用户名namestring必须姓名gendernumber必须性别, 说明: 1 男, 2 女imagestring非必须图像deptIdnumber非必须部门identrydatestring非必须入职日期jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师请求数据样例:{"id":1,"image":"https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg","username":"linpingzhi","name":"林平之","gender":1,"job":1,"entrydate":"2022-09-18","deptId":1}- 响应数据参数格式:application/json参数说明:参数名类型是否必须备注codenumber必须响应码,1 代表成功,0 代表失败msgstring非必须提示信息dataobject非必须返回的数据响应数据样例:{"code":1,"msg":"success","data":null}
  3. 代码实现
  • EmpMapper@MapperpublicinterfaceEmpMapper{//修改员工信息publicvoidupdate(Emp emp);//省略...}- EmpMapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.itheima.mapper.EmpMapper"><!--更新员工信息--><updateid="update"> update emp <set><iftest="username != null and username != ''"> username = #{username}, </if><iftest="password != null and password != ''"> password = #{password}, </if><iftest="name != null and name != ''"> name = #{name}, </if><iftest="gender != null"> gender = #{gender}, </if><iftest="image != null and image != ''"> image = #{image}, </if><iftest="job != null"> job = #{job}, </if><iftest="entrydate != null"> entrydate = #{entrydate}, </if><iftest="deptId != null"> dept_id = #{deptId}, </if><iftest="updateTime != null"> update_time = #{updateTime} </if></set> where id = #{id} </update><!-- 省略... --></mapper>- EmpServicepublicinterfaceEmpService{/** * 更新员工 * @param emp */publicvoidupdate(Emp emp);//省略...}- EmpServiceImpl@Slf4j@ServicepublicclassEmpServiceImplimplementsEmpService{@AutowiredprivateEmpMapper empMapper;@Overridepublicvoidupdate(Emp emp){ emp.setUpdateTime(LocalDateTime.now());//更新修改时间为当前时间 empMapper.update(emp);}//省略...}- EmpController@Slf4j@RestController@RequestMapping("/emps")publicclassEmpController{@AutowiredprivateEmpService empService;//修改员工@PutMappingpublicResultupdate(@RequestBodyEmp emp){ empService.update(emp);returnResult.success();}//省略...}

查询员工

  1. 需求
  • 根据ID查询员工信息
  1. 接口文档 根据ID查询员工数据- 基本信息请求路径:/emps/{id}请求方式:GET接口描述:该接口用于根据主键ID查询员工的信息- 请求参数参数格式:路径参数参数说明:参数名类型是否必须备注idnumber必须员工ID请求参数样例:/emps/1- 响应数据参数格式:application/json参数说明:名称类型是否必须默认值备注codenumber必须响应码, 1 成功 , 0 失败msgstring非必须提示信息dataobject必须返回的数据idnumber非必须idusernamestring非必须用户名namestring非必须姓名passwordstring非必须密码entrydatestring非必须入职日期gendernumber非必须性别 , 1 男 ; 2 女imagestring非必须图像jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师deptIdnumber非必须部门idcreateTimestring非必须创建时间updateTimestring非必须更新时间响应数据样例:{"code":1,"msg":"success","data":{"id":2,"username":"zhangwuji","password":"123456","name":"张无忌","gender":1,"image":"https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg","job":2,"entrydate":"2015-01-01","deptId":2,"createTime":"2022-09-01T23:06:30","updateTime":"2022-09-02T00:29:04"}}
  2. 代码实现
  • EmpMapper@MapperpublicinterfaceEmpMapper{//根据ID查询员工信息@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time "+"from emp "+"where id = #{id}")publicEmpfindById(Integer id);//省略...}- EmpServicepublicinterfaceEmpService{/** * 根据ID查询员工 * @param id * @return */publicEmpgetById(Integer id);//省略...}- EmpServiceImpl@Slf4j@ServicepublicclassEmpServiceImplimplementsEmpService{@AutowiredprivateEmpMapper empMapper;@OverridepublicEmpgetById(Integer id){return empMapper.findById(id);}//省略...}- EmpController@Slf4j@RestController@RequestMapping("/emps")publicclassEmpController{@AutowiredprivateEmpService empService;//根据id查询@GetMapping("/{id}")publicResultgetById(@PathVariableInteger id){Emp emp = empService.getById(id);returnResult.success(emp);}//省略...}

后记

springboot + mybatis做数据的增删改查其实相对比较简单,我们根据上面的案例就可以进行学习,主要关注的是常用的注解以及mybatis复杂查询时xml文件的配置。


本文转载自: https://blog.csdn.net/Android_xue/article/details/142333367
版权归原作者 SunnyRivers 所有, 如有侵权,请联系我们删除。

“SpringBootWeb增删改查入门案例”的评论:

还没有评论