• SpringBoot案例(黑马学习笔记)


    这个案例呢,就是Tlias智能学习辅助系统。

    参考接口文档完成后端功能的开 发,然后结合前端工程进行联调测试即可。

    完成后的成品效果展示:

    准备工作

    需求&环境搭建

    需求说明

    部门管理

    部门管理功能开发包括:

    ● 查询部门列表

    ● 删除部门

    ● 新增部门

    ● 修改部门

    员工管理

    员工管理功能开发包括:

    ● 查询员工列表(分页、条件)

    ● 删除员工

    ● 新增员工

    ● 修改员工

    环境搭建

    步骤:

        1.准备数据库表(dept、emp)

        2.创建springboot工程,引入对应的起步依赖(web、mybatis、mysql驱动、lombok)

        3.配置文件application.properties中引入mybatis的配置信息,准备对应的实体类

        4.准备对应的Mapper、Service(接口、实现类)、Controller基础结构

    第1步:准备数据库表

    1. -- 部门管理
    2. create table dept(
    3. id int unsigned primary key auto_increment comment '主键ID',
    4. name varchar(10) not null unique comment '部门名称',
    5. create_time datatime not null comment '创建时间',
    6. update_time datetime not null comment '修改时间'
    7. ) comment '部门表';
    8. -- 部门表测试数据
    9. insert into dept (id,name,create_time,update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),(4,'就业步',now(),now()),(5,'人事部',now(),now());
    10. -- 员工管理(带约束)
    11. create table emp (
    12. id int unsigned primary key auto_increment comment 'ID',
    13. username varchar(20) not null unique comment '用户名',
    14. password varchar(32) default '123456' comment '密码',
    15. name varchar(10) not null comment '姓名',
    16. gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
    17. image varchar(300) comment '图像',
    18. job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
    19. entrydate date comment '入职时间',
    20. dept_id int unsigned comment '部门ID',
    21. create_time datetime not null comment '创建时间',
    22. update_time datetime not null comment '修改时间'
    23. ) comment '员工表';
    24. -- 员工表测试数据
    25. INSERT INTO emp
    26. (id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
    27. (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
    28. (2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
    29. (3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
    30. (4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
    31. (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
    32. (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
    33. (7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
    34. (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
    35. (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
    36. (10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
    37. (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
    38. (12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
    39. (13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
    40. (14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
    41. (15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
    42. (16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),
    43. (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

    第2步:创建一个SpringBoot工程,选择引入对应的起步依赖(web、mybatis、mysql驱动、lombok) (版本选择2.7.5版本,可以创建完毕之后,在pom.xml文件中更改版本号)

    生成的pom.xml文件:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.5version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.itheimagroupId>
    12. <artifactId>tlias-web-managementartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>tlias-web-managementname>
    15. <description>Demo project for Spring Bootdescription>
    16. <properties>
    17. <java.version>11java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-webartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.mybatis.spring.bootgroupId>
    26. <artifactId>mybatis-spring-boot-starterartifactId>
    27. <version>2.3.0version>
    28. dependency>
    29. <dependency>
    30. <groupId>com.mysqlgroupId>
    31. <artifactId>mysql-connector-jartifactId>
    32. <scope>runtimescope>
    33. dependency>
    34. <dependency>
    35. <groupId>org.projectlombokgroupId>
    36. <artifactId>lombokartifactId>
    37. <optional>trueoptional>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframework.bootgroupId>
    41. <artifactId>spring-boot-starter-testartifactId>
    42. <scope>testscope>
    43. dependency>
    44. dependencies>
    45. <build>
    46. <plugins>
    47. <plugin>
    48. <groupId>org.springframework.bootgroupId>
    49. <artifactId>spring-boot-maven-pluginartifactId>
    50. <configuration>
    51. <excludes>
    52. <exclude>
    53. <groupId>org.projectlombokgroupId>
    54. <artifactId>lombokartifactId>
    55. exclude>
    56. excludes>
    57. configuration>
    58. plugin>
    59. plugins>
    60. build>
    61. project>

    创建项目工程目录结构:

    第3步:配置文件application.properties中引入mybatis的配置信息,准备对应的实体类

    ● application.properties (直接把之前项目中的复制过来)

    1. #数据库连接
    2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    3. spring.datasource.url=jdbc:mysql://localhost:3306/tlias
    4. spring.datasource.username=root
    5. spring.datasource.password=1234
    6. #开启mybatis的日志输出
    7. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    8. #开启数据库表字段 到 实体类属性的驼峰映射
    9. mybatis.configuration.map-underscore-to-camel-case=true

    ● 实体类

    1. /*部门类*/
    2. @Data
    3. @NoArgsConstructor
    4. @AllArgsConstructor
    5. public class Dept {
    6. private Integer id;
    7. private String name;
    8. private LocalDateTime createTime;
    9. private LocalDateTime updateTime;
    10. }
    1. /*员工类*/
    2. @Data
    3. @NoArgsConstructor
    4. @AllArgsConstructor
    5. public class Emp {
    6. private Integer id;
    7. private String username;
    8. private String password;
    9. private String name;
    10. private Short gender;
    11. private String image;
    12. private Short job;
    13. private LocalDate entrydate;
    14. private Integer deptId;
    15. private LocalDateTime createTime;
    16. private LocalDateTime updateTime;
    17. }

    第4步:准备对应的Mapper、Service(接口、实现类)、Controller基础结构

    数据访问层:

    ● DeptMapper

    1. package com.itheima.mapper;
    2. import org.apache.ibatis.annotations.Mapper;
    3. @Mapper
    4. public interface DeptMapper {
    5. }

    ● EmpMapper

    1. package com.itheima.mapper;
    2. import org.apache.ibatis.annotations.Mapper;
    3. @Mapper
    4. public interface EmpMapper {
    5. }

    业务层:

    ● DeptService

    1. package com.itheima.service;
    2. //部门业务规则
    3. public interface DeptService {
    4. }

    ● DeptServiceImpl

    1. package com.itheima.service.impl;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.stereotype.Service;
    4. //部门业务实现类
    5. @Slf4j
    6. @Service
    7. public class DeptServiceImpl implements DeptService {
    8. }

    ● EmpService

    1. package com.itheima.service;
    2. //员工业务规则
    3. public interface EmpService {
    4. }

    ● EmpServiceImpl

    1. package com.itheima.service.impl;
    2. import com.itheima.service.EmpService;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.stereotype.Service;
    5. //员工业务实现类
    6. @Slf4j
    7. @Service
    8. public class EmpServiceImpl implements EmpService {
    9. }

    控制层:

    ● DeptController

    1. package com.itheima.controller;
    2. import org.springframework.web.bind.annotation.RestController;
    3. //部门管理控制器
    4. @RestController
    5. public class DeptController {
    6. }

    ● EmpController

    1. package com.itheima.controller;
    2. import org.springframework.web.bind.annotation.RestController;
    3. //员工管理控制器
    4. @RestController
    5. public class EmpController {
    6. }

    项目工程结构:

    部门管理

    我们按照前面学习的开发流程,开始完成功能开发。首先按照之前分析的需求,完成部门管理的功能开发。

    开发的部门管理功能包含:

        1.查询部门

        2.删除部门

        3.新增部门

        4.更新部门

    查询部门

    原型和需求

    查询的部门的信息:部门ID、部门名称、修改时间

    通过页面原型以及需求描述,我们可以看到,部门查询,是不需要考虑分页操作的。

    接口文档

    部门列表查询 ​​​​​​​

    ● 基本信息

    请求路径:/depts

    请求方式:GET

    接口描述:该接口用于部门列表数据查询

    ● 请求参数

    ● 响应数据

    参数格式:application/json

    参数说明:

    参数名类型是否必须备注
    codenumber必须响应码,1 代表成功,0 代表失败
    msgstring非必须提示信息
    dataobject[ ]非必须返回的数据
    |- idnumber非必须id
    |- namestring非必须部门名称
    |- createTimestring非必须创建时间
    |- updateTimestring非必须

    修改时间

    响应数据样例:

    1. {
    2. "code": 1,
    3. "msg": "success",
    4. "data": [
    5. {
    6. "id": 1,
    7. "name": "学工部",
    8. "createTime": "2022-09-01T23:06:29",
    9. "updateTime": "2022-09-01T23:06:29"
    10. },
    11. {
    12. "id": 2,
    13. "name": "教研部",
    14. "createTime": "2022-09-01T23:06:29",
    15. "updateTime": "2022-09-01T23:06:29"
    16. }
    17. ]
    18. }
    思路分析

    功能开发

    通过查看接口文档:部门列表查询

    请求路径:/depts

    请求方式:GET

    请求参数:无

    响应数据:json格式

    DeptController

    1. @Slf4j
    2. @RestController
    3. public class DeptController {
    4. @Autowired
    5. private DeptService deptService;
    6. //@RequestMapping(value = "/depts" , method = RequestMethod.GET)
    7. @GetMapping("/depts")
    8. public Result list(){
    9. log.info("查询所有部门数据");
    10. List deptList = deptService.list();
    11. return Result.success(deptList);
    12. }
    13. }

    @Slf4j注解源码:

    DeptService(业务接口)

    1. public interface DeptService {
    2. /**
    3. * 查询所有的部门数据
    4. * @return 存储Dept对象的集合
    5. */
    6. List list();
    7. }

    DeptServiceImpl(业务实现类)

    1. @Slf4j
    2. @Service
    3. public class DeptServiceImpl implements DeptService {
    4. @Autowired
    5. private DeptMapper deptMapper;
    6. @Override
    7. public List list() {
    8. List deptList = deptMapper.list();
    9. return deptList;
    10. }
    11. }

    DeptMapper

    1. @Mapper
    2. public interface DeptMapper {
    3. //查询所有部门数据
    4. @Select("select id, name, create_time, update_time from dept")
    5. List<Dept> list();
    6. }
    功能测试

    功能开发完成后,我们就可以启动项目,然后打开postman,发起GET请求,访问 :http://localhost:8080/depts

    前后端联调

    说明:只要按照接口文档开发功能接口,就能保证前后端程序交互

    ● 后端:严格遵守接口文档进行功能接口开发

    ● 前端:严格遵守接口文档访问功能接口

    删除部门

    需求

    ​​​​​​​

    点击部门列表后面操作栏的 "删除" 按钮,就可以删除该部门信息。 此时,前端只需要给服务端传递一个ID参数就可以了。 我们从接口文档中也可以看得出来。

    接口文档

    删除部门

    ● 基本信息

    请求路径:/depts/{id}

    请求方式:DELETE

    接口描述:该接口用于根据ID删除部门数据

    ● 请求参数

    参数格式:路径参数

    参数说明:

    参数名类型是否必须备注
    idnumber必须

    部门ID

    请求参数样例:

    /depts/1

    ● 响应数据

    参数格式:application/json

    参数说明:

    参数名类型是否必须备注
    codenumber必须响应码,1代表成功,0代表失败
    msgstring非必须提示信息
    dataobject非必须

    返回的数据

    响应数据样例:

    1. {
    2. "code":1,
    3. "msg":"success",
    4. "data":null
    5. }
    思路分析

    接口文档规定:

    ● 前端请求路径:/depts/{id}

    ● 前端请求方式:DELETE

    问题1:怎么在controller中接收请求路径中的路径参数?

    @PathVariable

    问题2:如何限定请求方式是delete?

    @DeleteMapping

    功能开发

    通过查看接口文档:删除部门

    请求路径:/depts/{id}

    请求方式:DELETE

    请求参数:路径参数 {id}

    响应数据:json格式

    DeptController

    1. @Slf4j
    2. @RestController
    3. public class DeptController {
    4. @Autowired
    5. private DeptService deptService;
    6. @DeleteMapping("/depts/{id}")
    7. public Result delete(@PathVariable Integer id) {
    8. //日志记录
    9. log.info("根据id删除部门");
    10. //调用service层功能
    11. deptService.delete(id);
    12. //响应
    13. return Result.success();
    14. }
    15. //省略...
    16. }

    DeptService

    1. public interface DeptService {
    2. /**
    3. * 根据id删除部门
    4. * @param id 部门id
    5. */
    6. void delete(Integer id);
    7. //省略...
    8. }

    DeptServiceImpl

    1. @Slf4j
    2. @Service
    3. public class DeptServiceImpl implements DeptService {
    4. @Autowired
    5. private DeptMapper deptMapper;
    6. @Override
    7. public void delete(Integer id) {
    8. //调用持久层删除功能
    9. deptMapper.deleteById(id);
    10. }
    11. //省略...
    12. }

    DeptMapper

    1. @Mapper
    2. public interface DeptMapper {
    3. /**
    4. * 根据id删除部门信息
    5. * @param id 部门id
    6. */
    7. @Delete("delete from dept where id = #{id}")
    8. void deleteById(Integer id);
    9. //省略...
    10. }
    功能测试

    删除功能开发完成后,重新启动项目,使用postman,发起DELETE请求:

    前后端联调

    打开浏览器,测试后端功能接口:

  • 相关阅读:
    C++:内存管理
    2023-06-17:说一说redis中渐进式rehash?
    kubernetes CNI(Container Network Inferface)
    Java学习星球,十月集训,五大赛道(文末送书)
    Java代码优化的30个小技巧
    bean 的六种作用域
    Java PipedReader类简介说明
    前端调取摄像头并实现拍照功能
    Text2SQL中不同数据库SQL之间转换的实战代码
    HTTP协议中URI和URL有什么区别
  • 原文地址:https://blog.csdn.net/2301_78533951/article/details/136350755