第十六篇: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.rhkb.cn/news/312918.html

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

相关文章

手机拍照技术

拍照技巧 说明: 本文将主要介绍摄影和手机常见技巧&#xff1b; 1. 摄影的基本知识 **说明&#xff1a;**关于摄影&#xff0c;手机和相机的原理都是相同的&#xff0c;不同的是相机在很多方面优于手机&#xff0c;但是专业的设备对于我们这种的非专业的人来说&#xff0c;刚…

【八股】Redisson分布式锁

Redisson分布式锁 主要了解了Redisson分布式锁实现的三个功能&#xff1a; 1.可重入 -> 防止死锁 2.可重试&#xff08;i.e. 非阻塞获取锁&#xff09; 3.自动续约 1. 可重入 原理&#xff1a; 利用Redis的Hash结构&#xff0c;记录了使用当前锁的线程id和重用次数&#…

React + 项目(从基础到实战) -- 第八期

ajax 请求的搭建 引入mockAP接口设计AJAX 通讯 前置知识 HTTP 协议 , 前后端通讯的桥梁API : XMLHttpRequest 和 fetch常用工具axios mock 引入 Mock.js (mockjs.com) 使用 mockJS 前端代码中引入 mockJs定义要模拟的路由 , 返回结果mockJs 劫持ajax请求(返回模拟的结果)…

【读论文】【泛读】三篇生成式自动驾驶场景生成: Bevstreet, DisCoScene, BerfScene

文章目录 1. Street-View Image Generation from a Bird’s-Eye View Layout1.1 Problem introduction1.2 Why1.3 How1.4 My takeaway 2. DisCoScene: Spatially Disentangled Generative Radiance Fields for Controllable 3D-aware Scene Synthesis2.1 What2.2 Why2.3 How2.4…

C++进阶(2)-函数

目录 一、函数提高 1.1函数默认参数 1.2函数占位参数 1.3函数重载 1.3.1函数重载概述 1.3.2函数重载注意事项 二、类和对象 2.1封装 2.1.1封装的意义 2.1.2struct和class区别 2.1.3成员属性设置为私有 2.1.4封装案例 2.2对象的初始化和清理 2.2.1构造函数和析构函数 …

van-uploader 在app内嵌的webview中的一些坑

问题&#xff1a; 部分版本在ios 中没有问题&#xff0c;但是安卓中不触发图片选择和拍照&#xff08;之前是可以的&#xff0c;可能是没有锁定版本&#xff0c;重新发版导致的&#xff09;。在ios中下拉文案是英文&#xff0c;html配置lang等于 zh 也没有用&#xff0c;ios里…

Learn SRP 02

3.Editor Rendering 3.1Drawing Legacy Shaders 因为我们的管线只支持无光照的着色过程&#xff0c;使用其他不同的着色过程的对象是不能被渲染的&#xff0c;他们被标记为不可见。尽管这是正确的&#xff0c;但是它还是隐藏了场景中一些使用错误着色器的对象。所以让我们来渲…

libftdi1学习笔记 5 - SPI Nor Flash

目录 1. 初始化 2. CS控制例子 3. 读ID 3.1 制造商 3.2 容量大小 3.3 设置IO类型 3.3.1 setQSPIWinbond 3.3.2 setQSPIMxic 3.3.3 setQSPIMicrochip 3.3.4 setQSPIMicron 4. 写保护 5. 等待空闲 6. 擦除扇区 7. 页编程 8. 页读 9. 写 10. 读 11. 验证 基于M…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

Xshell无法输入命令输入命令卡顿

Xshell是一款功能强大的终端模拟软件&#xff0c;可以让用户通过SSH、Telnet、Rlogin、SFTP等协议远程连接到Linux、Unix、Windows等服务器。然而&#xff0c;在使用Xshell的过程中&#xff0c;我们可能会遇到一些问题。比如输入不了命令&#xff0c;或者输入命令很卡。这些问题…

content-type对数据采集的影响,猿人学58题

在拿猿人学网站 https://www.python-spider.com/api/challenge58 练习的时候发现请求头中少了 content-type之后结果全部不对了 当我设置headers如下时 headers {# accept: application/json, text/javascript, */*; q0.01,content-type: application/x-www-form-urlencode…

445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 示例1&#xff1a; 输入&#xff1a;l1 [7,2,4,3], l2 [5,6,4]…

2024腾讯一道笔试题--大小写字母移动

题目&#x1f357; 有一个字符数组,其中只有大写字母和小写字母,将小写字母移到前面, 大写字符移到后面,保持小写字母本身的顺序不变,大写字母本身的顺序不变, 注意,不要分配新的数组.(如:wCelOlME,变为wellCOME). 思路分析&#x1f357; 类似于冒泡排序&#xff0c;两两比较…

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对疾病防控信息管理的提升&a…

snort安装和使用

win10 x64安装snort 下载snort https://www.snort.org/downloads 下载npcap 0.9984版本 https://npcap.com/dist/ 安装npcap ,snort 安装成功 如果使用npcap版本不对或者使用winpcap会出现错误,winpcap不在win10运行。 snort.conf #-----------------------------------…

多ip证书实现多个ip地址https加密

在互联网快速发展的现在&#xff0c;很多用户会使用由正规数字证书颁发机构颁发的数字证书&#xff0c;其中IP数字证书就是只有公网IP地址网站的用户用来维护网站安全的手段。由于域名网站比较方便记忆&#xff0c;只有公网IP地址的网站是很少的&#xff0c;相应的IP数字证书产…

Python 入门指南(一)

原文&#xff1a;zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 这个学习路径帮助你在 Python 的世界中感到舒适。它从对 Python 的全面和实用的介绍开始。你将很快开始在学习路径的第一部分编写程序…

5. Mysql的binlog介绍

参考&#xff1a;InnoDB学习&#xff08;三&#xff09;之BinLog 1. BinLog介绍 BinLog又称为二进制日志&#xff0c;是MySQL服务层的数据日志&#xff0c;MySQL所有的存储引擎都支持BinLog。 BinLog记录了MySQL中的数据更新和可能导致数据更新的事件&#xff0c;可以用于主从…

逆向案例二十七——某笔网登录接口非对称加密算法RSA,涉及全扣代码,浏览器断点调试,和补环境

网址&#xff1a;aHR0cHM6Ly93d3cuZmVuYmkuY29tL3BhZ2UvaG9tZQ 点击账号密码登录&#xff0c;找到登陆的包&#xff0c;发现password进行了加密。 顿时&#xff0c;老生常谈&#xff0c;开始搜索&#xff0c;找到最有嫌疑的加密代码。进行搜索&#xff0c;进入js文件后&#x…

HarmonyOS开发实例:【任务延时调度】

介绍 本示例使用[ohos.WorkSchedulerExtensionAbility] 、[ohos.net.http]、[ohos.notification] 、[ohos.bundle]、[ohos.fileio] 等接口&#xff0c;实现了设置后台任务、下载更新包 、保存更新包、发送通知 、安装更新包实现升级的功能。 效果预览 使用说明 安装本应用之…