第十六篇:springboot案例

news2024/12/22 9:12:29

文章目录

  • 一、准备工作
    • 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 {
    @Autowired
    private 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 {
    @Autowired
    private DeptMapper deptMapper;

    /*
     * 查询全部部门数据
     * */
    @Override
    public 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);

接口实现类

  /*
     * 删除部门
     * */
    @Override
    public 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);
  }
    
@PutMapping
  public 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实现类

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

@Override
  public 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层实现类如下:

 @Override
    public 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层实现类如下:

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

Mapper层
mapper:

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

xml:

   <!--
        批量删除
    -->
    <delete id="delete">
        delete
        from tlias.emp
        where 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层实现类如下:

    /*
     * 新增员工
     * */
    @Override
    public 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("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

Controller代码如下

    @Autowired
    private 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查询
     * */
    @Override
    public 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层
具体如下:

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

        empService.update(emp);
        return Result.success();
    }

Service层
Service层接口如下:

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

Service层实现类如下:

  /*
     * 修改员工
     * */
    @Override
    public 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.coloradmin.cn/o/1602600.html

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

相关文章

MySQL基础知识——MySQL事务

事务背景 什么是事务&#xff1f; 一组由一个或多个数据库操作组成的操作组&#xff0c;能够原子的执行&#xff0c;且事务间相互独立&#xff1b; 简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 注&#xff1a;MyS…

【Java探索之旅】掌握数组操作,轻松应对编程挑战

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组巩固练习1.1 数组转字符串1.2 数组拷贝1.3 求数组中的平均值1.4 查找数组中指…

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么&#xff1f;2、nvm是什么&#xff1f; 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

书生·浦语大模型实战营之Lagent AgentLego 智能体应用搭建

书生浦语大模型实战营之Lagent & AgentLego 智能体应用搭建 Lagent 简介 Lagent 是一个轻量级开源智能体框架&#xff0c;旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、R…

【系统分析师】应用数学部分

文章目录 1、图论应用1.1 最小生成树1.2 最短路径1.3 网络与最大流量 2、运筹方法2.1 关键路径法2.2 线性规划2.3 动态规划2.4 预测与决策2.4.1 囚徒困境2.4.2 实例&#xff1a;商业竞争 2.5 状态转移矩阵2.6 排队论2.7 决策2.7.1 决策2.7.2不确定型决策2.7.3 决策树2.7.4 决策…

4.17号驱动

中断子系统 1. 中断工作原理 1.1 异常处理流程 保存现场(cpu自动完成) 保存cpsr寄存器中的值&#xff0c;到spsr_寄存器中 修改cpsr寄存器中的值 修改状态位(T位) 根据需要禁止相应的中断位(I/F) 修改对应模式位 保存函数的返回地址到lr寄存器中 修改pc指向异常向量表 …

Realsense D455 调试

1 Realsense D455 配置&#xff1a; RGB&#xff1a;彩色相机&#xff0c;FOV&#xff08;h&#xff0c;v&#xff09;&#xff08; 90*65 &#xff09;红外点阵发射&#xff1a;位于上图中RGB右边&#xff0c;发射特定模式的红外光&#xff0c;通常是一种点阵图案&#xff0c…

深度学习架构(CNN、RNN、GAN、Transformers、编码器-解码器架构)的友好介绍。

一、说明 本博客旨在对涉及卷积神经网络 &#xff08;CNN&#xff09;、递归神经网络 &#xff08;RNN&#xff09;、生成对抗网络 &#xff08;GAN&#xff09;、转换器和编码器-解码器架构的深度学习架构进行友好介绍。让我们开始吧&#xff01;&#xff01; 二、卷积神经网络…

Dryad Girl Fawnia

一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色,幻想或装扮游戏。 🔥 Dryad Girl | Fawnia 一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色…

网络攻防演练:一场针锋相对的技术博弈与安全防护实践

随着ChatGPT5的即将上线&#xff0c;其安全防护能力面临更为严峻的考验。网络攻防演练作为检验系统安全性能、提升防御体系的关键环节&#xff0c;对于确保ChatGPT5的安全稳定运行具有重要意义。本文将深入探讨网络攻击与防守之间的动态关系&#xff0c;并提供在网络攻防演练中…

【Leetcode每日一题】 分治 - 颜色分类(难度⭐⭐)(57)

1. 题目解析 题目链接&#xff1a;75. 颜色分类 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路解析 本算法采用三指针法&#xff0c;将数组划分为三个区域&#xff0c;分别用于存放值为0、1和2的元素。通过…

vivado 设置 VIO 核以执行测量、查看 VIO 核状态

设置 VIO 核以执行测量 您添加到自己的设计中的 VIO 核会显示在“硬件 (Hardware) ”窗口中的目标器件下。如果未显示这些 VIO 核 &#xff0c; 请右键 单击器件并选择“ Refresh Hardware ”。这样将重新扫描 FPGA 或 ACAP 并刷新“ Hardware ”窗口。 注释 &#xff…

【免费】基于SOE算法的多时段随机配电网重构方法

1 主要内容 该程序是完全复现《Switch Opening and Exchange Method for Stochastic Distribution Network Reconfiguration》&#xff0c;也是一个开源代码&#xff0c;网上有些人卖的还挺贵&#xff0c;本次免费分享给大家&#xff0c;代码主要做的是一个通过配电网重构获取…

“面包板”是什么?有啥用?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

一种范围可调式测径仪 满足生产各规格检测!

摘要&#xff1a;范围可调式测径仪&#xff0c;满足各种外径尺寸的产品检测&#xff0c;囊括产线的所有规格&#xff0c;性价比更高的测径仪。 关键词&#xff1a;测径仪,范围可调测径仪,在线测径仪 引言 生产线中&#xff0c;各种外径尺寸的线材、棒材、管材都有生产&#xff…

【SAP NWDI】服务开启:SLD,CM,CMS(二)

一、启用System Landscape Directory 二、启用 NWDI using CMS

CAN的底层驱动

框架图 拆解链路模型 CAN子系统 can_controller Core 包含协议控制器和接收/发送移位寄存器。它可处理所有 ISO 11898-1: 2015 协议功能,并支持 11 位和 29 位标识符。

一、基础算法-快速排序

1.快速排序 快速排序主要利用了分治的思想&#xff0c;具体步骤为&#xff1a; step1 确定分界点&#xff0c;常用为q[left],q[right],q[mid]&#xff0c;也可以是随机的 step2 调整区间&#xff0c;将比分界点小的放左边&#xff0c;大的放右边 step3 利用递归处理左右两端 …

嵌入式Linux串口通信

嵌入式板子就和普通用的单片机比如stm32开发板&#xff0c;51开发板差不多&#xff0c;他们的串口都很类似&#xff0c;都是直接连上然后在PC机器上用串口软件打开就好了。 我使用的嵌入式开发板上面有8个rs485串口&#xff0c;2个rs232串口以及一个网口&#xff0c;刚开始开发…

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…