当前位置: 首页 > news >正文

SpringBoot案例,通关版

项目目录

  • 此项目为了伙伴们可以快速入手SpringBoot项目,全网最详细的版本,每个伙伴都可以学会,这个项目每一步都会带大家做,学完后可以保证熟悉SpringBoot的开发流程
  • 项目介绍:项目使用springboot +mybatis进行开发
  • 带你一起写小项目
    • 先把初始环境给你们
    • 第一步新建springboot项目
    • 返回结果的封装类 Result
    • SpringBoot的三层架构
    • 数据库,实体类
    • 配置Mybatis
      • mybatis.xml的三个规范
        • 第一个是同包同名
        • 第二个,mapper.xml的namespace要与mapper全类名进行一致
        • 第三个是方法中的 id 要与maper的方法名一致
  • 第一个业务的开发 部门查询
  • 前后端联调
      • 总结
  • 删除部门业务
    • 删除部门的业务
  • 部门管理-新增部门
  • 部门管理-修改部门
  • 分页查询
    • 分页查询-思路
    • 使用分页插件 PageHelper
  • 文件上传
    • 文件上传接入云服务 阿里云OSS
  • 修改员工-查询回显
  • 配置文件-参数配置化
  • 配置文件-@ConfigurationProperties
  • 员工性别统计


此项目为了伙伴们可以快速入手SpringBoot项目,全网最详细的版本,每个伙伴都可以学会,这个项目每一步都会带大家做,学完后可以保证熟悉SpringBoot的开发流程

项目介绍:项目使用springboot +mybatis进行开发

带你一起写小项目

先把初始环境给你们

在这里插入图片描述

链接: https://pan.baidu.com/s/1At81Y_CQZlKFOPqzyY4vXw?pwd=tvhs 提取码: tvhs 复制这段内容后打开百度网盘手机App,操作更方便哦

下载资料,里面有sql文件,写后
然后根据开发规范的Result类

第一步新建springboot项目

在这里插入图片描述
在这里插入图片描述

springboot是对spring的封装

然后我们点击创建项目

创建完后我们会进入这个页面
在这里插入图片描述

选择两个文件然后删除
在这里插入图片描述

然后根据开发流程
前后端分离开发,后端要根据接口文档进行开发,接口文档在前面分享的资料里面

返回结果的封装类 Result

首先我们要确定开发规范,也就是遵守restful开发风格规范,返回值要result封装为统一的格式

package com.healer.common;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public 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);}
}

一个result类
里面有 code msg 还有data
在这里插入图片描述

然后result里面有静态方法
在这里插入图片描述有成功的返回方法

SpringBoot的三层架构

开发项目的时候,要进行分层,有controller层 还有service层 还有mapper层, 这三层结构是互相调用的,前段发起请求请求到达controller层,然后controller调用service 最后service调用mapper

数据库,实体类

在资料里面有实体类的创建,可以直接用,

在这里插入图片描述
在这里插入图片描述

然后导入到 idea中 ,实体类要导入到 com.healer.pojo中
在这里插入图片描述
在这里插入图片描述
然后直接使用lombok注解
@Data 这个作用是lombok在编译的时候会给实体类加入get set 方法
然后写入 @NoArgsConstructor @AllArgsConstructor

那么这个实体类就创建完毕了

实体类的作用是与数据库中的表字段进行对应,一个实体类对应一个表

只有这样,才能将数据库中的数据查询出来然后返回给实体类,实体类再进行封装为对象

在这里插入图片描述
现在我们的项目基础的搭建以及完成了

就是丢一个common包下的result
然后是controller包下的在这里插入图片描述
然后是service下面的
在这里插入图片描述
接口与实现类实现类继承接口,然后实现类上面要加入@Service注解,这个作用是告诉spring这是一个service对象,要让spring将这个类加入到ioc容器中,被spring管理,所以我们使用@Autowride拿到的bean对象都是被spring管理的对象,也就是代理对象
在这里插入图片描述
mapper也是,也要加入@Mapper

配置Mybatis

mybatis的起步依赖,数据库的连接依赖
在这里插入图片描述
mybatis的起步依赖配置后,要配置mapper的xml文件

mybatis.xml的三个规范

第一个是同包同名

也就是在这里插入图片描述
xml要与mapper所在相同的级别并且类名要与xml名一致

第二个,mapper.xml的namespace要与mapper全类名进行一致

在这里插入图片描述

第三个是方法中的 id 要与maper的方法名一致

然后xml创建好后,就可以配置properties的配置

#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.healer.pojo
#驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tails?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

开启mybatis的驼峰映射

第一个业务的开发 部门查询

根据接口文档
在这里插入图片描述
首先是一个部门的查询

那么我们就从DeptController进行开发

package com.healer.controller;import com.healer.common.Result;
import com.healer.pojo.Dept;
import com.healer.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author healer* @Description DeptController* @data 2024-05-30 16:31*/
@RestController
@Slf4j
@RequestMapping("/depts")
public class DeptController {@Autowiredprivate DeptService deptService;@GetMappingpublic Result selectDeptList() {List<Dept> deptList = deptService.selectDeptList();return Result.success(deptList);}
}

首先进行@ResultController,表示这个是一个controller层

然后引入service
由于service被spring管理了,所以直接引入就行

然后我们就根据接口文档进行开发

我们查询的是所有的部门所以,要使用list集合去接收数据

    List<Dept> deptList = deptService.selectDeptList();return Result.success(deptList);

然后返回Result.success(deptList);
开发service层
在这里插入图片描述
在这里插入图片描述
然后调用mapper
在这里插入图片描述
使用注解直接查询

进行测试
postman测试

在这里插入图片描述

前后端联调

开发完接口后,进行前后端联调
首先打开前端,使用nginx运行后,访问
在这里插入图片描述
访问后有数据说明前后端联调成功

在这里插入图片描述查看nginx.conf

在这里插入图片描述

nginx端口号90
然后进行代理

总结

开发流程 : 明确需求 接口文档 思路分析 接口开发

在这里插入图片描述

删除部门业务

在这里插入图片描述

删除部门的业务

首先写sql语句测试,测试之后就根据开发文档进行开发

在这里插入图片描述先看请求地址
然后再看请求方式

请求参数是一个id

响应结果是直接返回删除成功

所以不需要service层返回值
在这里插入图片描述
直接在controller层调用service方法后就直接返回成功就行

然后进行测试,测试通过

controller层

    /*** 根据id删除部门* @param id* @return*/@DeleteMapping("/{id}")public Result delectDeptById(@PathVariable("id") Integer id) {deptService.delectDeptById(id);return Result.success();}

service层

    @Overridepublic void delectDeptById(Integer id) {deptMapper.delectDeptById(id);}

mapper层

    @Delete("delete from dept where id=#{id}")void delectDeptById(@Param("id") Integer id);

部门管理-新增部门

开发新增部门
首先查看接口四要素

请求方式为post
请求路径为 /depts

请求参数是一个name

返回值,相应数据
为json数据
在这里插入图片描述

直接返回成功的信息

书写controller层代码

  @PostMappingpublic Result addDept(@RequestBody Dept dept) {log.info("开始新增部门");deptService.addDept(dept);return Result.success();}

写service层

  @Overridepublic void addDept(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.addDept(dept);}

mapper层

    @Insert("insert into  dept ( name, create_time, update_time) values (#{dept.name},#{dept.createTime},#{dept.updateTime})")void addDept(@Param("dept") Dept dept);

书写之后进行测试

在这里插入图片描述
添加成功
使用post请求
发送json数据

{
“name”: “测试部”
}

部门管理-修改部门

两个接口
一个是根据id查询 部门
一个是根据id修改部门

分析接口四要素
请求方式
请求参数
请求路径
返回值

直接返回就行了

controller层

/*** 根据部门id查询部门信息** @param id* @return*/@GetMapping("/{id}")public Result findDeptById(@PathVariable("id") Integer id) {Dept dept = deptService.findDeptById(id);return Result.success(dept);}/*** 根据id修改部门** @param dept* @return*/@PutMappingpublic Result updateDept(@RequestBody Dept dept) {log.info("开始进行部门修改");deptService.updateDept(dept);return Result.success();}

service层

@Overridepublic Dept findDeptById(Integer id) {Dept dept = deptMapper.findDeptById(id);return dept;}@Overridepublic void updateDept(Dept dept) {dept.setUpdateTime(LocalDateTime.now());deptMapper.updateDept(dept);}

mapper层

@Select("select id, name, create_time, update_time from dept where id=#{id}")Dept findDeptById(@Param("id") Integer id);@Update("update dept set  name=#{dept.name} ,update_time=#{dept.updateTime} where id =#{dept.id}")void updateDept(@Param("dept") Dept dept);

然后进行测试

分页查询

不管做什么项目,只要是分页查询,那么前端就给服务器两个参数
一个是pagenum
一个是pagesize

那么服务器端也就返回

List数据
还有total总记录数

返回结果
data
要返回给前端两个参数
项目开发返回的是Result对象
data里面存储的是数据
所以,一次不能返回两个数据,
只能把这个两个数据都封装在一个对象里面,
一个是list 一个是total
将page对象封装进data中
使用pageBean进行两个参数的封装

在这里插入图片描述

package com.healer.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** @author healer* @Description PageBean* @data 2024-05-30 22:41*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {//    总记录数private Long total;private List<Emp> rows;
}

分页查询-思路

分页查询需要两个sql语句
一个用于查询总数
一个用于分页查询

controller层
在这里插入图片描述

当进行分页查询的时候,前端会进行传递两个参数
一个参数是page一个参数是pgesize

controller层接收到请求后 直接调用service
service中要先去获取总记录数
再去获取结果列表
最后再将 总记录数与结构列表封装pagebean,返回给controller

controller层

在这里插入图片描述

service层
在这里插入图片描述
在这里插入图片描述
查询了两个接口

在这里插入图片描述

使用分页插件 PageHelper

在这里插入图片描述

分页的步骤都是重复的,所以可以使用插件

文件上传

在这里插入图片描述

在这里插入图片描述

文件上传前端怎么做

前端页面

在这里插入图片描述
所有的文件上传都使用post
在这里插入图片描述

文件上传

使用表单

使用表单提交数据
需要在表单上面加入 enctype="multipart/form-data"
<form action="/upload" method="post"  enctype="multipart/form-data">姓名:<input type="text" name="username"><br>年龄:<input type="text" name="age"><br>图像:<input type="file" name="image"><br><input type="submit" value="提交">
</form>

后端接受请求

使用参数接受

下面是详细讲解

首先前端三个要素
第一个使用post提交
action 使用 /upload
然后上传的文件使用 file
type =file

在controller中书写

  @PostMapping("/upload")public Result uploadFile(String username, Integer age, MultipartFile image) throws IOException {log.info("文件上传.....{} {}", username, age);image.transferTo(new File("D:\\images\\1.md"));return Result.success();}

在这里插入图片描述

文件上传接入云服务 阿里云OSS

这个功能单独提取出来进行详解,可以直接进入,详细教程

链接: link

也可以使用腾讯云,下面介绍多种云的使用

修改员工-查询回显

首先修改员工的话,第一步就是继续页面的回显,回显就是根据id查询员工
在这里插入图片描述

当点击编辑的时候
页面会进行回显

在这里插入图片描述# 更新员工

直接调用mapper进行书写更新接口

配置文件-参数配置化

容易变动的参数都放置在配置文件

参数配置化是将参数动态的配置在参数文件当中
然后使用只需要加载就可以 使用@Value()

在这里插入图片描述
在这里插入图片描述

配置文件-@ConfigurationProperties

先定义一个实体类
在这里插入图片描述
在这里插入图片描述
需要使用@ConfigurationProperties(prefix=“aliyun.oss”)

在这里插入图片描述
原则怎么是简单怎么来

@Value
与@ConfigurationProperties

员工性别统计

是根据性别分组

首先是使用if语句,将查询出来的数据进行修改

然后再起别名 讲字段名字进行修改

相关文章:

  • 实时瞳孔分割算法-RITnet论文复现
  • 【Python】超时请求或计算的处理
  • Dify快速接入微信
  • C++之map
  • OVF(Open Virtualization Format)或OVA(Open Virtual Appliance)格式有什么区别
  • OpenGL 和 DirectX 矩阵 乘法 左乘和右乘,glm和DirectXMath。 OpenGL用列矩阵 在 glsl中反转矩阵
  • C语言(数据存储)
  • 计算机网络学习实践:模拟PPP协议验证虚拟局域网(VLAN)
  • 【人工智能Ⅱ】实验8:生成对抗网络
  • 做外贸,怎么选国外服务器?
  • “神经网络之父”和“深度学习鼻祖”Geoffrey Hinton
  • 字节裁员!开启裁员新模式。。
  • 鸿蒙开发接口资源调度:【@ohos.backgroundTaskManager (后台任务管理)】
  • uni微信小程序editor富文本组件如何插入图片
  • Linux离线一键安装Docker及docker-compose环境
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【个人向】《HTTP图解》阅后小结
  • Apache的80端口被占用以及访问时报错403
  • CSS盒模型深入
  • ES学习笔记(12)--Symbol
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP请求重发
  • java 多线程基础, 我觉得还是有必要看看的
  • Java 网络编程(2):UDP 的使用
  • java小心机(3)| 浅析finalize()
  • js
  • JS基础之数据类型、对象、原型、原型链、继承
  • leetcode388. Longest Absolute File Path
  • Python打包系统简单入门
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Wamp集成环境 添加PHP的新版本
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows下mongoDB的环境配置
  • 实现菜单下拉伸展折叠效果demo
  • 赢得Docker挑战最佳实践
  • postgresql行列转换函数
  • 仓管云——企业云erp功能有哪些?
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragma data_seg 共享数据区(转)
  • (¥1011)-(一千零一拾一元整)输出
  • (13)DroneCAN 适配器节点(一)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (java)关于Thread的挂起和恢复
  • (补)B+树一些思想
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (四) 虚拟摄像头vivi体验
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。