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 {

    @Autowired
    private DeptService deptService;

    @GetMapping
    public 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层

    @Override
    public 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层代码

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

写service层

  @Override
    public 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
     */
    @PutMapping
    public Result updateDept(@RequestBody Dept dept) {

        log.info("开始进行部门修改");
        deptService.updateDept(dept);
        return Result.success();

    }

service层


    @Override
    public Dept findDeptById(Integer id) {
        Dept dept = deptMapper.findDeptById(id);
        return dept;
    }

    @Override
    public 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语句,将查询出来的数据进行修改

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/675939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短剧出海的优势分析

海外短剧作为一种新兴的内容形式&#xff0c;正以其独特的魅力迅速占领市场&#xff0c;为企业带来了前所未有的商业机遇。本文将深入探讨短剧出海的优势&#xff0c;并为企业和老板们提供实用的操作指南。短剧出海是一个包含多个步骤的复杂过程&#xff0c;短剧出海需要综合考…

第100天:权限提升-数据库RedisPostgre第三方软件TV向日葵服务类

目录 思维导图 案例一: 数据库-Redis 数据库权限提升-计划任务 案例二: 数据库-PostgreSQL 数据库权限提升-漏洞 PostgreSQL 提权漏洞&#xff08;CVE-2018-1058&#xff09; PostgreSQL 高权限命令执行漏洞&#xff08;CVE-2019-9193&#xff09; 案例三: 三方应用-…

使用system verilog进行流水灯和VGA打印字符

使用system verilog进行流水灯和VGA打印字符 目录 **使用system verilog进行流水灯和VGA打印字符****system verilog的优点****VGA程序编写**VGA 控制器模块字符生成模块顶层模块测试基准程序**效果** **流水灯程序设计****效果** **总结** system verilog的优点 面向对象编程…

C# WinForm —— 27 28 29 30 ListView 介绍与应用

1. 简介 和ListBox的外观类似&#xff0c;都可以多列显示&#xff0c;但 ListView 功能更强大&#xff0c;提供了5种不同的显示方式 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用CheckBoxes复选框是否显示在项旁边ContextMenuStri…

浏览器渲染优--防抖节流懒加载

合理选择css选择器 相比于.content-title-span&#xff0c;使用.content .title span时&#xff0c;浏览器计算样式所要花费的时间更多。使用后面一种规则&#xff0c;浏览器必须遍历页面上所有 span 元素&#xff0c;先过滤掉祖先元素不是.title的&#xff0c;再过滤掉.title…

拿笔记下来!产品采购制造类合同怎样写比较稳妥?

拿笔记下来&#xff01;产品采购制造类合同怎样写比较稳妥&#xff1f; 近日&#xff0c;几经波折&#xff0c;泰中两国终于完成了潜艇采购谈判&#xff01;你知道吗&#xff1f;产品制造类合同或协议在起草前如果没有充分考虑各种因素&#xff0c;可能会导致一系列问题和不利…

奶茶店、女装店、餐饮店是高危创业方向,原因如下:

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 现在的俊男靓女们&#xff0c;心中都有一个执念&#xff1a; (1)想证明自己了&#xff0c;开个奶茶去…… (2)想多赚点钱了&#xff0c;加盟餐饮店去…… (3)工作不顺心了&#xff0c;搞个女装店去…… 但凡抱着…

【scau数据库实验一】mysql_navicat_数据库定义实验、基本命令

实验一开始之前&#xff0c;如果还有不会使用navicat建议花五分钟补课哦~ 补课地址&#xff1a;【scau数据库实验先导】mysql_navicat_数据库新建、navicat的使用-CSDN博客 实验目的&#xff1a; 理解和掌握数据库DDL语言&#xff0c;能够熟练地使用SQL DDL语句创建、修改和删…

mac电脑用谷歌浏览器对安卓手机H5页面进行inspect

1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑&#xff1a;使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面&#xff0c;点击inspect&#xff0c;就能像谷歌浏览器页面打开下面的页面&#…

Vue——初识组件

文章目录 前言页面的构成何为组件编写组件组件嵌套注册 效果展示 前言 在官方文档中&#xff0c;对组件的知识点做了一个很全面的说明。本篇博客主要写一个自己的案例讲解。 vue 官方文档 组件基础 页面的构成 说到组件之前&#xff0c;先大致说明下vue中页面的构成要素。 在…

Claude 3可使用第三方API,实现业务流程自动化

5月31日&#xff0c;著名大模型平台Anthropic宣布&#xff0c;Claude3模型可以使用第三方API和工具。 这也就是说&#xff0c;用户通过文本提问的方式就能让Claude自动执行多种任务&#xff0c;例如&#xff0c;从发票中自动提取姓名、日期、金额等&#xff0c;该功能对于开发…

【问题随记】System policy prevents Wi-Fi scans,解决连接 WIFI 需要权限的问题

问题随记 System policy prevents Wi-Fi scans&#xff0c;每次打开我的开发板连接 wifi 都会出现下面的弹窗&#xff0c;这也阻挡了我的WIFI自动连接&#xff0c;然后就需要连上屏幕&#xff0c;输入 wifi 密码&#xff0c;这样才能进行 VNC、SSH 等一系列的连接。 问题解决 …

『 Linux 』缓冲区(万字)

文章目录 &#x1f9a6; 什么是缓冲区&#x1f9a6; 格式化输入/输出&#x1f9a6; 刷新策略&#x1fab6; 块缓冲(fully buffered)&#x1fab6; 无缓冲(unbuffered)&#x1fab6; 行缓冲(line buffered) &#x1f9a6; 现象解释&#x1f9a6; exit()与_exit()&#x1f9a6; 进…

CPU 使用率过高问题排查

文章目录 CPU 使用率过高问题排查1. CPU使用率过高常见问题2. 压力测试2.1 stress安装参数说明测试示例 2.2 stress-ng安装参数说明测试示例 3. 问题排查3.1 使用 top 命令3.2 使用 ps 命令3.3 使用 perf top3.4 vmstat 命令常用信息内存信息磁盘信息 CPU 使用率过高问题排查 …

Plotting World Map in Python

1. 方法一 pygal Plotting World Map Using Pygal in Python import pygal # create a world map worldmap pygal.maps.world.SupranationalWorld() # set the title of map worldmap.title Continents# adding the continents worldmap.add(Africa, [(africa)]) worl…

【微信小程序】小锦哥小程序工具 v2.3.8.0

# 简介 小锦哥小程序工具是一款可以对微信小程序进行解密或者反编译的工具&#xff0c;通过这款工具&#xff0c;可以对别人已经发布的小程序进行解密或者是反编译&#xff0c;然后查看源代码。对于网络安全人员来说&#xff0c;可以使用该工具进行安全审计&#xff0c;发现其…

四川汇聚荣聚荣科技有限公司评价怎么样?

四川汇聚荣聚荣科技有限公司评价如何?在科技日新月异的今天&#xff0c;四川汇聚荣聚荣科技有限公司作为业界的一员&#xff0c;其表现自然引起了广泛关注。那么&#xff0c;这家公司究竟如何呢?接下来&#xff0c;我们将从四个不同方面对其进行深入剖析。 一、技术实力 四川…

3DGS语义分割之LangSplat

LangSplat是CVPR2024的paper. 实现3DGS的语义分割&#xff08;可文本检索语义&#xff09; github: https://github.com/minghanqin/LangSplat?tabreadme-ov-file 主要思想是在3DGS中加入了CLIP的降维语义特征&#xff0c;可用文本检索目标&#xff0c;实现分割。 配置环境&…

三十四、openlayers官网示例Dynamic clusters解析——动态的聚合图层

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/clusters-dynamic.html 这篇绘制了多个聚合图层。 先初始化地图 &#xff0c;设置了地图视角的边界extent&#xff0c;限制了地图缩放的范围 initMap() {const raster new TileLayer({source: new XYZ…

导入和使用标准模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自带了很多实用的模块&#xff0c;称为标准模块&#xff08;也可以称为标准库&#xff09;&#xff0c;对于标准模块&#xf…