SpringBoot案例,通关版

news2024/11/26 5:40:41

项目目录

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


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

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

带你一起写小项目

先把初始环境给你们

在这里插入图片描述

链接: https://pan.baidu.com/s/1GiFHtS2aTbmKtj0gV0FGJA?pwd=srjq 提取码: srjq 复制这段内容后打开百度网盘手机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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP协议介绍与TCP协议的区别

1、HTTP介绍 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 是基于TCP/IP 进行数据的通信&#xff0c;通常使用端口 80/8080。HTT…

项目纪实 | 版本升级操作get!GreatDB分布式升级过程详解

某客户项目现场&#xff0c;因其业务系统要用到数据库新版本中的功能特性&#xff0c;因此考虑升级现有数据库版本。在升级之前&#xff0c;万里数据库项目团队帮助客户在本地测试环境构造了相同的基础版本&#xff0c;导入部分生产数据&#xff0c;尽量复刻生产环境进行升级&a…

机器学习笔记(1):sklearn是个啥?

sklearn 简介 Sklearn是一个基于Python语言的开源机器学习库。全称Scikit-Learn&#xff0c;是建立在诸如NumPy、SciPy和matplotlib等其他Python库之上&#xff0c;为用户提供了一系列高质量的机器学习算法&#xff0c;其典型特点有&#xff1a; 简单有效的工具进行预测数据分…

GEYA格亚GRT8-S1S2间歇性双时间循环继电器时间可调交流220V 24v

品牌 GEYA 型号 GRT8-S2 AC/DC12-240V 产地 中国大陆 颜色分类 GRT8-S1 A220,GRT8-S1 AC/DC12-240V,GRT8-S2 A220,GRT8-S2 AC/DC12-240V GRT8-S&#xff0c;循环延时&#xff0c;时间继电器&#xff1a;LED指示灯&#xff0c;触头容量大&#xff0c;电压超宽&#xff0…

构建树结构的几种方式

表结构 CREATE TABLE sys_dept (dept_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ID,pid bigint(20) DEFAULT NULL COMMENT 上级部门,sub_count int(5) DEFAULT 0 COMMENT 子部门数目,name varchar(255) NOT NULL COMMENT 名称,dept_sort int(5) DEFAULT 999 COMMENT 排…

【C#】类和对象的区别

1.区别概述 结构体和类的最大区别是在存储空间上&#xff0c;前者是值类型&#xff0c;后者是引用类型&#xff0c;它们在赋值上有很大的区别&#xff0c;在类中指向同一块空间的两个类的值会随一个类的改变而改变另一个&#xff0c;请看如下代码所示&#xff1a; namespace …

020.有效的括号,用栈来解决的 Java 版 LeetCode 刷题笔记

题意 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型…

FreeRTOS【12】队列集使用

1.开发背景 基于以上的章节&#xff0c;了解了 FreeRTOS 多线程间的信号量、队列的使用&#xff0c;已经满足了日常使用场景。这个篇章要介绍的是队列集&#xff0c;实际上队列的升级版&#xff0c;存储信号量和队列等的触发事件。 队列集在实际的开发项目中应用相对比较少&…

linux同步搭建多台服务器

前言&#xff1a; 如果在安装服务器的过程中&#xff0c;需要安装多台服务器&#xff0c;同样的配置&#xff0c;同样的步骤就可以使用此方法&#xff0c;搭建集群同步安装 1.配置网卡 想要两台机器进行同步的话&#xff0c;必须网段是同样的&#xff0c;保持在同一网段并且能…

科技智慧园区解决方案

随着科技创新的推动和城市化进程的加速&#xff0c;城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性&#xff0c;是一个亟待解决的问题。在这个背景下&#xff0c;科技智慧园区作为一种新型的城市发展模式&#xff0c;引起了越来越多的关注和探索。 什么是科技智慧园…

Jmeter的线程组之间传递参数

使用jemter做接口测试&#xff0c;有时候需要会遇到不同线程组之间调用相同变量的情况&#xff0c;最多见的就是token的传递&#xff0c;网上有很多处理方法&#xff0c;这里只记录setProperty的办法&#xff0c;一招鲜走遍天&#xff01; 首先我有两个线程组&#xff1a; 线程…

Servlet搭建博客系统

现在我们可以使用Servlet来搭建一个动态(前后端可以交互)的博客系统了(使用Hexo只能实现一个纯静态的网页,即只能在后台自己上传博客)。有一种"多年媳妇熬成婆"的感觉。 一、准备工作 首先创建好项目,引入相关依赖。具体过程在"Servlet的创建"中介绍了。…

WiFi蓝牙模块促进传统零售数字化转型:智能零售体验再升级

随着科技的不断发展&#xff0c;数字化转型已经成为了各行各业的必然趋势。在传统零售业中&#xff0c;WiFi蓝牙模块的应用正逐渐推动着行业的数字化转型&#xff0c;为消费者带来更加智能化、便捷化的零售体验。本文MesoonRF美迅物联网将从以下几个方面阐述WiFi蓝牙模块在传统…

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

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

GCN 代码解析(一) for pytorch

Graph Convolutional Networks 代码详解 前言一、数据集介绍二、文件整体架构三、GCN代码详解3.1 utils 模块3.2 layers 模块3.3 models 模块3.4 模型的训练代码 总结 前言 在前文中&#xff0c;已经对图卷积神经网络&#xff08;Graph Convolutional Neural Networks, GCN&am…

linux nohup命令详解:持久运行命令,无视终端退出

nohup &#xff08;全称为 “no hang up”&#xff09;&#xff0c;用于运行一个命令&#xff0c;使其在你退出 shell 或终端会话后继续运行。 基本语法 nohup command [arg1 ...] [&> output_file] &command 是你想要运行的命令。[arg1 ...] 是该命令的参数。&am…

STM32-14-FSMC_LCD

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU 文章目录 1. 显示器分类2. LCD简…

【稳定检索/投稿优惠】2024年语言、文化与艺术发展国际会议(LCAD 2024)

2024 International Conference on Language, Culture, and Art Development 2024年语言、文化与艺术发展国际会议 【会议信息】 会议简称&#xff1a;LCAD 2024大会时间&#xff1a;2024-08-10截稿时间&#xff1a;2024-07-27(以官网为准&#xff09;大会地点&#xff1a;中国…

【数学不建模】赛程安排

你所在的年级有5个班&#xff0c;每班一支球队在同一块场地上进行单循环赛, 共要进行10场比赛. 如何安排赛程使对各队来说都尽量公平呢. 下面是随便安排的一个赛程: 记5支球队为A, B, C, D, E&#xff0c;在下表左半部分的右上三角的10个空格中, 随手填上1,2,10, 就得到一个赛程…

新书推荐:9.5堆栈图解析生命周期

本节必须掌握的知识点&#xff1a; 掌握局部变量、全局变量存放在哪 熟练画堆栈图 掌握每个函数从哪开始被调用的&#xff0c;从哪结束的 开始看本节前&#xff0c;请读者思考如下几问题&#xff1a; 局部变量存放在哪里&#xff1f;全局变量存放在哪里&#xff1f;编译器是怎…