第十六篇:springboot案例

文章目录

  • 一、准备工作
    • 1.1 需求说明
    • 1.2 环境搭建
    • 1.3 开发规范
    • 1.4 思路
  • 二、部门管理
    • 2.1 查询部门
    • 2.2 删除部门
    • 2.3 新增部门
    • 2.4 修改部门
    • 2.5 RequestMapping
  • 三、员工管理
    • 3.1 分页查询
    • 3.2 删除员工
    • 3.3 新增员工
      • 3.3.1 新增员工
      • 3.3.2 文件上传
    • 3.4 修改员工
      • 3.4.1 页面回显
      • 3.4.2 修改信息
  • 四、效果展示
    • 4.1 部门管理
    • 4.2 员工管理
  • 五、小结

一、准备工作

1.1 需求说明

部门管理:

  • 查询部门列表
  • 删除部门
  • 新增部门
  • 修改部门

员工部门:

  • 查询员工列表(分页,条件)
  • 删除员工
  • 新增员工
  • 修改员工

在这里插入图片描述

1.2 环境搭建

环境搭建:

  • 准备数据表(emp,dept)
  • 创建springboot工程,引入对应的起步依赖(web,mybatis,mysql驱动,lombok)
  • 配置application.properties中引入mybatis配置信息,准备对应的实体类
  • 准备对应的Mapper,Service(接口.实现类),Controller基础结构

在这里插入图片描述

1.3 开发规范

案例基于当前最主流的前后端分离模式进行开发
在这里插入图片描述

Restful

  • REST(Representational State Transfer),表述性状态转换,是一种软件架构风格

传统风格没有一个固定的规范,而REST是一种风格,是默认的约定方式,约定不是规定,可以打破(但不建议)
描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源,如:users、emps、books、
在这里插入图片描述

  • GET:查询请求
  • POST:新增请求
  • PUT:修改请求
  • DELETE:删除id用户

统一响应结果

前后端交互统一响应结果Result

在这里插入图片描述

开发流程以此从左到右
在这里插入图片描述

1.4 思路

思路:
使用三层架构的方式
Controller层:接收请求,并调用service层查询部门
Service层:调用mapper接口查询
Mapper层:使用SQL语句查询,并把查询的结果传给Service
Service层:接收到Mapper层,再传给Controller
Controller层:接收响应,并传给客户端

在这里插入图片描述

二、部门管理

2.1 查询部门

Controller层
代码如下:

/*
* 部门管理
* */
@Slf4j
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping ("/depts")public Result list(){log.info("查询全部部门");List<Dept> deptList=deptService.list();return Result.success(deptList);}
}
注解含义
@Slf4j日志注解,可以直接使用log.info输出日志
@Autowired依赖注入注解
@RestController@ResponseBody+Conrtoller注解
@GetMapping用于get请求的注解

Service层
Service层接口如下:

public interface DeptService {/** 查询全部部门数据* */List<Dept> list();
}

Service层实现类如下:

@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;/** 查询全部部门数据* */@Overridepublic List<Dept> list() {return deptMapper.list();}
}

Mapper层
mapper层代码如下:

public interface DeptMapper {/** 查询全部部门数据* */@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from tlias.emp ")List<Dept> list();
}

2.2 删除部门

Controller层
代码如下:

    /** 删除部门* */@DeleteMapping("/depts/{id}")public Result deletc(@PathVariable Integer id){log.info("根据id删除部门:",id);deptService.delete(id);return Result.success();}
注解含义
@PathVariable用于接收路径参数的注解

Service层
Service层接口

    /** 删除部门* */void delete(Integer id);

接口实现类

  /** 删除部门* */@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}

Mapper层

   /** 根据ID删除部门* */@Delete("delete from tlias.dept where id = #{id} ")void deleteById(Integer id);

2.3 新增部门

Controller层
具体如下:

    /** 新增部门* */@PostMapping("/depts")public Result add(@RequestBody Dept dept){log.info("新增部门:",dept);deptService.add(dept);return Result.success();}

Service层
Service层接口

/*
* 新增部门
* */
void add(Dept dept);

Service实现类

/*
* 新增部门
* */
@Override
public void add(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.insert(dept);}

Mapper层
具体如下:

 /** 新增部门* */@Insert("insert tlias.dept (name, create_time, update_time) " +"values(#{name},#{createTime},#{updateTime}) ")void insert(Dept dept);

2.4 修改部门

Controller层
为了得到修改时页面返回的部门名称,需要先根据ID进行一次查询,用于页面的回显

在这里插入图片描述
代码如下:

@GetMapping("/{id}")public Result getById(@PathVariable Integer id){log.info("获取部门ID:",id);Dept dept = deptService.getById(id);return Result.success(dept);}@PutMappingpublic Result update(@RequestBody Dept dept) {log.info("修改部门:{}",dept);deptService.update(dept);return Result.success();}

Service层
Service层接口

    Dept getById(Integer id);void update(Dept dept);

Service实现类

@Overridepublic Dept getById(Integer id) {Dept dept = deptMapper.getByID(id);return dept;}@Overridepublic void update(Dept dept) {dept.setUpdateTime(LocalDateTime.now());deptMapper.update(dept);}

Mapper层
代码如下:

@Select("select * from tlias.dept where id = #{id}")Dept getByID(Integer id); 
@Update("update tlias.dept set name = #{name},update_time = #{updateTime} where id = #{id}")
void update(Dept dept);

2.5 RequestMapping

由于部门管理中所有的请求路径都是/depts开头,所以可以使用RequestMapping来简化请求的定义,直接抽取到类上
在这里插入图片描述
在这里插入图片描述
注意:一个完整的请求路径,应该是类上的@RequestMapping的value属性 + 方法上的@RequestMapping的value属性

三、员工管理

3.1 分页查询

Controller层

    @GetMapping("/emps")public Result     public Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数:{},{},{},{},{},{}",page,pageSize,name,gender,begin,end);PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end);return Result.success(pageBean);}

Service层
Service层接口如下:

  /** 分页查询* */PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);
}

Service层实现类如下:

 @Overridepublic PageBean page(Integer page, Integer pageSize , String name, Short gender, LocalDate begin, LocalDate end){// 1.设置分页参数PageHelper.startPage(page,pageSize);// 2.执行查询List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> p = (Page<Emp>) empList;// 3.封装pageBean对象PageBean pageBean = new PageBean(p.getTotal() ,p.getResult());return pageBean;}

Mapper层

   /** 查询总记录数* */public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

XML:

    <select id="list" resultType="com.itzhangxx.pojo.Emp">select *from tlias.emp<where><if test="name != null">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select>

PageHelper

3.2 删除员工

Controller层
具体代码如下:

    /** 批量删除* */@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids){log.info("批量删除:{}",ids);empService.delete(ids);return Result.success();}

Service层
Service层接口如下:

    /** 批量删除* */void delete(List<Integer> ids);

Service层实现类如下:

   /** 批量删除* */@Overridepublic void delete(List<Integer> ids) {empMapper.delete(ids);}

Mapper层
mapper:

  /** 批量删除* */void delete(List<Integer> ids);

xml:

   <!--批量删除--><delete id="delete">deletefrom tlias.empwhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>

3.3 新增员工

3.3.1 新增员工

Controller层
代码如下:

   /** 新增员工* */@PostMapping()public Result save(@RequestBody Emp emp){log.info("新增员工:{}",emp);empService.save(emp);return Result.success();}

Service层
Service层接口如下:

    /** 新增员工* */void save(Emp emp);

Service层实现类如下:

    /** 新增员工* */@Overridepublic void save(Emp emp) {emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.save(emp);}

Mapper层

  /** 新增员工* */@Insert("insert tlias.emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +"value ( #{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")void save(Emp emp);

3.3.2 文件上传

创建一个utils工具类

/*** 阿里云 OSS 工具类*/
@Component
public class AliOSSUtils {private String endpoint = "改为自己的" ;private String accessKeyId ="改为自己的" ;private String accessKeySecret = "改为自己的";private String bucketName = "改为自己的";/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖 使用UUID  tostring后都是得到拓展名String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}

Controller代码如下

    @Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload(MultipartFile image) throws IOException {log.info("文件上传,文件名:{}",image.getOriginalFilename());//调用阿里云工具类进行文件上传String url = aliOSSUtils.upload(image);log.info("文件上传成功,文件访问的url:{}",url);return Result.success(url);}

3.4 修改员工

3.4.1 页面回显

Controller层
具体如下:

    /** 页面回显,根据id查询* */@GetMapping("/{id}")public Result geyById(@PathVariable Integer id){log.info("根据id插叙信息:{}",id);Emp emp = empService.getById(id);return Result.success(emp);}

Service层
Service层接口如下:

  /** 页面回显,根据id查询* */Emp getById(Integer id);

Service层实现类如下:

  /** 页面回显,根据id查询* */@Overridepublic Emp getById(Integer id) {return empMapper.getById(id);}

Mapper层
具体如下:

    /** 页面回显,根据id查询* */@Select("select * from tlias.emp where id = #{id}")Emp getById(Integer id);

3.4.2 修改信息

Controller层
具体如下:

    /** 修改员工* */@PutMappingpublic Result update(@RequestBody Emp emp){log.info("更新员工信息:{}",emp);empService.update(emp);return Result.success();}

Service层
Service层接口如下:

  /** 修改员工* */void update(Emp emp);

Service层实现类如下:

  /** 修改员工* */@Overridepublic void update(Emp emp) {emp.setUpdateTime(LocalDateTime.now());empMapper.update(emp);}

Mapper层

    <!--修改员工--><update id="update">update tlias.emp<set><if test="username != null and username != '' ">username = #{username},</if><if test="name != null and name != '' ">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update>

四、效果展示

4.1 部门管理

主界面
在这里插入图片描述
新增
在这里插入图片描述

删除
在这里插入图片描述

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

4.2 员工管理

主界面
在这里插入图片描述
新增
在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述

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

查询
在这里插入图片描述

五、小结

写本文主要是为了分享我的学习过程,也是给自己记个笔记,哪里忘记了,回来再看一眼,也可以很快的回想起来

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

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

相关文章

【数据结构】-- 栈和队列

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

二十一.订单分析RFM模型

目录 1.数据读取 2.数据清洗 3.可视化分析 做图吧 4.RFM模型 本次数据条数为: 51101 import pandas as pd import numpy as np 1.数据读取 #读取文件 df_data pd.read_csv("../data/dataset.csv",encoding"gbk") df_data#因为列标签都是英文,这里我…

通讯录的实现(顺序表)

前言&#xff1a;上篇文章我们讲解的顺序表以及顺序表的具体实现过程&#xff0c;那么我们的顺序表在实际应用中又有什么作用呢&#xff1f;今天我们就基于顺序表来实现一下通讯录。 目录 一.准备工作 二.通讯录的实现 1.通讯录的初始化 2.插入联系人 3.删除联系人 4.…

手机副业赚钱秘籍:让你的手机变成赚钱利器

当今社会&#xff0c;智能手机已然成为我们生活不可或缺的一部分。随着技术的飞速进步&#xff0c;手机不再仅仅是通讯工具&#xff0c;而是化身为生活伴侣与工作助手。在这个信息爆炸的时代&#xff0c;我们时常会被一种焦虑感所困扰&#xff1a;如何能让手机超越消磨时光的定…

TinyEMU源码分析之访存处理

TinyEMU源码分析之访存处理 1 访存指令介绍2 指令译码3 地址转换3.1 VA与PA3.2 VA转PA 4 判断地址空间范围5 执行访存操作5.1 访问RAM内存5.2 访问非RAM&#xff08;设备&#xff09;内存 6 访存处理流程图 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其…

【AI】什么是Ai Agent

什么是AI Agent&#xff1f; AI Agent是指人工智能代理&#xff08;Artificial Intelligence Agent&#xff09;是一种能够感知环境进行自主理解&#xff0c;进行决策和执行动作的智能体。AI Agent具备通过独立思考、调用工具逐步完成给定目标的能力。不同于大模型的区别在于&…

OpenHarmony实战开发-如何使用屏幕属性getDefaultDisplaySync、getCutoutInfo接口实现适配挖孔屏。

介绍 本示例介绍使用屏幕属性getDefaultDisplaySync、getCutoutInfo接口实现适配挖孔屏。该场景多用于沉浸式场景下。 效果图预览 使用说明 1.加载完成后顶部状态栏时间和电量显示位置规避了不可用区域。 实现思路 1.通过setWindowLayoutFullScreen、setWindowSystemBarEn…

代码随想录训练营

Day23代码随想录 669.修剪二叉搜索树 1.题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有…

Hbase的简单学习一

一 Hbase的搭建与安装 1.1 安装 1.准备好文件&#xff0c;上传到Linux上 2.解压文件 tar zxvf hbase-2.2.7-bin.tar.gz -C ../ ../是解压到的路径 1.2 配置文件 1.配置环境变量 去etc/profile目录下 export HBASE_HOME/usr/local/soft/hbase-2.2.7 export PATH$PATH:$H…

.NET SignalR Redis实时Web应用

环境 Win10 VS2022 .NET8 Docker Redis 前言 什么是 SignalR&#xff1f; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项&#xff1a; 需要从服…

AI预测福彩3D第38弹【2024年4月17日预测--第8套算法开始计算第6次测试】

今天咱们继续测试第8套算法和模型&#xff0c;今天是第5次测试&#xff0c;目前的测试只是为了记录和验证&#xff0c;为后续的模型修改和参数调整做铺垫&#xff0c;所以暂时不建议大家盲目跟买~废话不多说了&#xff0c;直接上结果&#xff01; 2024年4月17日3D的七码预测结果…

K8S node节点执行kubectl get pods报错

第一个问题是由第二个问题产生的&#xff0c;第二个问题也是最常见的 网上找的都是从master节点把文件复制过来&#xff0c;这样确实可以解决&#xff0c;但是麻烦&#xff0c;有一个node节点还好&#xff0c;如果有多个呢&#xff1f;每个都复制吗&#xff1f;下面是我从外网…

RabbitMQ-核心特性

已经不需要为RabbitMQ交换机的离去而感到伤心了&#xff0c;接下来登场的是RabbitMQ-核心特性!!! 文章目录 核心特性消息过期机制消息确认机制死信队列 核心特性 消息过期机制 官方文档&#xff1a;https://www.rabbitmq.com/ttl.html 可以给每条消息指定一个有效期&#xf…

Ubuntu 20.04.06 PCL C++学习记录(二十五)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 使用渐进形态滤波器分割识别地面回波&#xff0c;即执…

【一竞技CS2】VP战队官宣签下electroNic取代mir

1、近日VP战队官宣签下electroNic&#xff0c;以取代阵容中的mir。 electroNic自己也表示&#xff1a;“VP是一支顶级队伍。阵容核心曾赢得Major冠军&#xff0c;所有队员都处于巅峰状态并且时刻准备着去争夺冠军。我们有着一样的雄心壮志。 此外我还对和Jame很感兴趣&#xf…

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…

如何用Jenkins执行自动化测试构建

摘要 依据Jenkins官网介绍&#xff0c;Jenkins是一个流行的开源持续集成和交付工具&#xff0c;它提供了一个可扩展的插件生态系统&#xff0c;可以用于自动化构建、测试和部署软件项目。 本文介绍如何安装使用Jenkins、常见问题解决方案以及深入应用&#xff0c;为自动化测试…

艾迪比皮具携手工博科技SAP ERP公有云,打造数字化转型新标杆

4月1日&#xff0c;广州市艾迪比皮具有限公司&#xff08;以下简称“艾迪比”&#xff09;SAP S/4HANA Cloud Public Edition&#xff08;以下简称“SAP ERP公有云”&#xff09;项目正式启动。双方项目组领导、成员出席本次项目启动会&#xff0c;为未来项目的顺利实施打下坚实…

滚雪球学Java(74):深入理解JavaSE输入输出流:掌握数据流动的奥秘

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴 bug菌&#xff0c;今天又来给大家手把手教学Java SE系列知识点啦&#xff0c;赶紧出来哇&#xff0c;别躲起来啊&#xff0c;听我讲干货记得点点赞&#xff0c;赞多了我就更有动力讲得更欢哦&#xff01;所以呀&…

nginx学习记录-动静分离

1. 动静分离原理 我们在访问网站资源的时候&#xff0c;通常会将资源分成两种&#xff0c;一种是静态资源&#xff08;前端的固定界面&#xff0c;比如图片&#xff0c;html页面等&#xff09;&#xff0c;这些资源无需后台程序处理&#xff1b;另一种是动态资源&#xff0c;这…