Java Web —— 第七天(Mybatis案例 员工管理2)

news2024/11/26 11:55:48

新增员工 

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

EmpServiceImpl实现类
//新增员工
    @Override
    public void save(Emp emp) {
        //补充基础属性 创建和修改属性
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);
    }
EmpMapper接口
    //新增员工
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
            "values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    void insert(Emp emp);

文件上传

文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程

文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能

1. 前端页面三要素、

表单项 type="file"

表单提交方式post

表单的enctype属性multipart/form-data

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>

    <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>

</body>
</html>

2.服务端接收文件

MultipartFile

@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image){
        log.info("文件上传:{},{},{}",username,age,image);
        return Result.success();
    }
}

本地存储

在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中 

package com.example.controller;

import com.example.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.channels.MulticastChannel;
import java.util.UUID;

/**
 * @author hyk~
 */
@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传:{},{},{}",username,age,image);

        //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //构造唯一文件名(不能重复) - uuid(通用唯一识别码) ad7088db-9673-433a-bc59-f280dec36fc4
        int index = originalFilename.lastIndexOf(".");
        String extname = originalFilename.substring(index);
        //构建新的文件名
        String newFileName = UUID.randomUUID().toString()+extname;
        log.info("新的文件名:{}",newFileName);


        //将文件存储在磁盘目录中
        image.transferTo(new File("D:\\测试\\"+newFileName));

        return Result.success();
    }

}

在SpringBoot中,文件上传,默认单个文件允许最大大小为1M。如果需要上传大文件,可以进

行如下配置:

#配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大大小的限制(一次请求中可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

相关方法 

    String getOriginalFilename(); //获取原始文件名
    void transferTo(File dest); //将接收的文件转存到磁盘文件中
    long getSize(); //获取文件的大小,单位: 字节
    byte[] getBytes(); //获取文件内容的字节数组
    InputStream getlnputStream();//获取接收到的文件内容的输入流

阿里云OSS

阿里云对象存储0SS(0bject Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

阿里云OSS-使用步骤

Bucket: 存储空间是户用于存储对象 (Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间

SDK:Software Developmnt Kit 的缩写,软件开发丁具包,包括辅助软件开发的依赖 (iar包),代码示例等,都可以叫做SDK

安装SDK

方式一: 在Maven项目中加入依赖项 (推荐方式)在Maven工程中使用OSS Java SDK,只需在

pom.xml中加入相应依赖可。以3.15.1版本为例,在<dependencies>中加入如下内容:

        <!--阿里云OSS依赖-->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>3.15.1</version>
		</dependency>

代码实现

package com.example.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {

    private String endpoint = "https://oss-cnangzhou.aliyuncs-h.com";
    private String accessKeyId = "LTAI4GCH1vX6DKqJWxd6nEuW";
    private String accessKeySecret = "yBshYweHOpqDuhCArrVHwIiBKpyqSL";
    private String bucketName = "web-tlias";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        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类

@Slf4j
@RestController
public class UploadController {
    @Autowired
    private AliOSSUtils aliOSSUtils;
    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}",image.getOriginalFilename());
        //调用阿里云OSS工具类进行文件上传
        String url = aliOSSUtils.upload(image);
        log.info("文件上传完成:文件访问的url为:{}",url);

        //将图片上传后的url返回 用于浏览器回显操作
        return Result.success();
    }


}

小结

1.文件上传介绍

2.前端页面三要素 (file表单项、post方式、multipart/form-data)

3.服务端接收文件(MultipartFile)

4.文件存储方式

本地存储 (无法直接访问、磁盘损坏)磁盘空间限制

云存储OSS

修改员工

数据请求处理类
    //根据id查询数据
    //单条数据用实体类 多条数据用List<实体类类型>集合
    @GetMapping("/{id}")
    public Result selectById(@PathVariable Integer id){
        log.info("根据id查询员工:{}",id);
        Emp emp = empService.select(id);
        return Result.success(emp);
    }

    //修改数据  json格式数据用实体类接收 加注解@RequestBody
    @PutMapping
    public Result updateEmp(@RequestBody Emp emp){
        log.info("需要修改的员工信息:{}",emp);
        empService.updateEmp(emp);
        return Result.success();
    }
业务层实现类
 //根据id查询员工 回显数据
    @Override
    public Emp select(Integer id) {
        Emp emp = empMapper.selectById(id);
        return emp;
    }

    //修改员工数据
    @Override
    public void updateEmp(Emp emp) {
        //设置修改时间为当前
       emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateEmp(emp);
    }
动态SQL
    <!--修改员工数据-->
    <update id="updateEmp">
        update emp
        <set>
            --test当中的属性判断应当与实体类中的属性一致
            <if test="username != null and username != ''">
                username=#{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
            <if test="name != null and name != ''">
                name=#{name},
            </if>
            <if test="gender != null">
                gender=#{gender},
            </if>
            <if test="image != null and 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>
小结
  • 前端输入更新数据:在前端页面输入的数据以JSON格式发送到后端

  • 后端映射为Java实体类:后端通过@RequestBody接收这个JSON数据,并将其映射为对应的Emp实体类对象

  • 判断并生成动态SQL:MyBatis在处理更新操作时,会根据实体类中的属性值进行判断(使用<if>标签中的test条件)。如果某个属性为null或空字符串,则对应的字段不会出现在SQL语句中,也就不会更新数据库中的这个字段;如果不为null或空字符串,则生成的SQL会更新对应的数据库字段。

  • 最终效果:通过这种机制,只有前端传递的非空字段才会更新数据库中的相应字段,而那些为空的字段会保持数据库中原有的值不变

  • 单条数据查询

    • 当查询结果是单条记录时,可以直接用一个实体类对象来接收。这种情况下,查询的SQL语句通常使用select ... where id = ?或其他能确保返回唯一结果的条件。
    • 在MyBatis中,对应的返回类型是Emp
  • 多条数据查询

    • 当查询结果是多条记录时,用List<实体类类型>集合来接收。这种情况下,SQL语句可能是select ... where ...,返回的结果集包含多条记录。
    • 在MyBatis中,对应的返回类型是List<Emp>

@RequestBody@PathVariable的区别

  • 数据来源不同

    • @RequestBody:用于接收请求体中的JSON数据,并将其映射为Java对象(如Emp)。
    • @PathVariable:用于从URL路径中提取单个变量(如ID或其他简单标识符)。
  • 数据结构不同

    • @RequestBody:适用于复杂的对象,例如Emp对象包含多个属性(如nameagegender等),这些属性通常通过JSON传递。
    • @PathVariable:适用于简单标识符,如ID或名称,通常是一两个字符串或数字。

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

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

相关文章

jmeter中添加ip欺骗

1、首先在本机电脑中通过配置文件创建添加ip的配置文件&#xff0c;先创建一个txt格式的&#xff0c;直接修改文件名以及后缀为ips.bat 2、编辑该ips.bat文件&#xff0c;在文件中输入如下内容&#xff0c;用于快速给本机添加ip地址&#xff0c;&#xff08;2&#xff0c;1&…

今年奥运会的场馆设计,竟然藏着这样的黑科技!

随着奥运会的盛大开幕&#xff0c;全球观众不仅关注运动员的精彩表现&#xff0c;也被奥运场馆的壮丽设计所吸引。这些场馆不仅外观炫酷&#xff0c;功能齐全&#xff0c;更重要的是背后应用了一系列先进的技术和材料&#xff0c;其中最为亮眼的就是巴黎奥运会永久性体育场馆之…

“救命快刊”:升到2区,IF3.1,水平低也无俱,专家意见中肯不难为人

1、期刊简介&#xff1a; International Journal of Green Energy • 出版社&#xff1a;Taylor and Francis • 影响因子&#xff1a;3.1 • 期刊分区&#xff1a;JCR2/3区&#xff0c;中科院4区 • 检索数据库&#xff1a;SCI&EI 2、研究领域&#xff1a; 分享了能源…

开源好用的堡垒机工具Jumpserver

Jumpserver是一个由杭州飞致云信息科技有限公司&#xff08;FIT2CLOUD飞致云&#xff09;开发的开源堡垒机系统&#xff0c;旨在帮助企业构建和强化运维安全审计能力。 以下是关于Jumpserver的详细介绍&#xff1a; 一、基本概述 定义&#xff1a;Jumpserver是一个开源的堡垒…

CTFshow之RCE代码命令远程执行第53关到第64关详细讲解。可私信!

手眼通天和大人。 --真锅和 引言&#xff1a;今天继续ctf之旅&#xff01;&#xff01;解决53关到64关 ps&#xff1a;今天是8.22&#xff0c;重新回归开始填坑&#xff0c;先发个废品 一、实验准备 1、ctf网址&#xff1a;ctf.show 2、工具&#xff1a;fi…

cmd发送邮件:如何通过命令提示符发邮件?

cmd发送邮件的安全性考量&#xff1f;如何设置cmd发送邮件&#xff1f; 通过命令提示符发送邮件则提供了一种便捷且高效的方法&#xff0c;特别是在自动化任务和脚本化工作流程中。AokSend将介绍如何通过命令提示符实现发送邮件&#xff0c;并讨论其应用场景和注意事项。 cmd…

上线一天销售额超15亿!《黑神话:悟空》火爆全网的技术秘诀!

昨日&#xff08;8月20日&#xff09;上午&#xff0c;国产游戏《黑神话&#xff1a;悟空》正式发售&#xff0c;在全球游戏市场掀起巨大狂潮&#xff01;上线第一天在Steam的PCCU&#xff08;同时在线用户数峰值&#xff09;排名已成为第三&#xff01; 此款游戏上线即回本。…

Stable Diffusion【应用篇】【艺术写真】:超高相似度人物换脸写真,IP-Adapter与InstantID完美结合

艺术写真&#xff0c;以其独特的魅力&#xff0c;吸引了无数艺术爱好者和摄影爱好者。如今&#xff0c;借助Stable Diffusion的IP-Adapter和InstantID技术&#xff0c;你只需一键操作&#xff0c;就能轻松实现超高相似度的人物换脸写真。本文将带你深入了解Stable Diffusion的I…

如何建立Pod

文章目录 一、Pod的生命周期建立pod1. 提交 Pod 定义2. API 服务器处理3. 调度4. 节点准备5. 容器初始化6. 启动应用容器7. 持续管理 Pod结束Pod的探针1. 存活探针&#xff08;Liveness Probe&#xff09;2. 就绪探针&#xff08;Readiness Probe&#xff09;3. 启动探针&#…

Transformer微调实战:通过低秩分解(LoRA)对T5模型进行微调(LoRA Fine Tune)

scient scient一个用python实现科学计算相关算法的包&#xff0c;包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。 scient源码和编译安装包可以在Python package index获取。 The source code and binary installers for the latest released version ar…

思博伦仪表打流测试使用总结

下载安装包: 打开浏览器地址:http://192.168.6.244欢迎来到思博伦TestCenterhttp://192.168.6.244 点击下图中红框中的链接: 打开安装包,并按照提示按照即可。 1,仪表口使用 选择并占用测试仪端口在客户端软件的初始界面,点击红框中的链接:

智慧公厕系统在旅游景区的应用前景

在科技飞速发展的当今时代&#xff0c;智慧公厕系统正逐渐成为旅游景区提升服务品质的新亮点。它以先进的技术和创新的理念&#xff0c;为游客带来全新的如厕体验&#xff0c;同时也为景区的管理带来了诸多便利&#xff0c;展现出广阔的应用前景。 一、智慧公厕系统为游客带来的…

CompletableFuture.allOf().get()引起的线程池死锁

CompletableFuture<Void> voidCompletableFuture CompletableFuture.allOf(completableFutures);可以同步等待一组异步请求都返回结果后&#xff0c;再往下执行。voidCompletableFuture.get()会同步等待所有结果返回&#xff0c;并且不会超时。就因为没有设置超时时间&a…

深入浅出,探讨IM(即时通讯-聊天工具)技术架构及用户界面设计

在数字化时代的浪潮中&#xff0c;即时通讯&#xff08;IM&#xff09;工具已然成为人们日常沟通的重要方式。从微信、QQ到飞信钉、喧喧IM、企业微信、钉钉、Slack&#xff0c;这些IM工具不仅为我们提供了便捷的沟通方式&#xff0c;更在技术架构和用户界面设计上展现了独特的魅…

WPF中如何使用后台代码动态创建数据模板(DataTemplate)

数据模板回顾 在WPF中数据模板可以控制数据的呈现方式。 对于一些简单的数据&#xff0c;例如一个string&#xff0c;一个int&#xff0c;在显示时&#xff0c;无须额外控制 。 但是对于复杂数据类型&#xff0c;就需要使用数据模板来控制数据的呈现方式。 一个简单的例子 …

熟悉Labview工具用

目录复制 目录 0.0&#xff1a;快捷键0.1&#xff1a;全局非图标显示0.2&#xff1a;小技巧&#xff1a;图片导入为程序1.2&#xff1a;事件结构1.2.0&#xff1a;超时分支&#xff1a;当事件结构框左上角设置为1时&#xff0c;单位毫秒&#xff0c;即理解为1ms内没有其他的事件…

Redis远程字典服务器(10)—— 渐进式命令与数据库管理命令

一&#xff0c;关于渐进式命令 我们之前讲过keys命令&#xff0c;可以把一次性把整个Redis的所有key都获取到&#xff0c;所以这个操作比较“危险”&#xff0c;可能会一下子得到太多的key&#xff0c;从而阻塞Redis服务器通过渐进式命令&#xff0c;就能做到&#xff1a;既能…

高质量翻译对确保中国开发者获得高质量、高质量体验的影响

在全球市场上&#xff0c;中国开发商越来越努力地通过他们的游戏、应用程序和软件产品吸引国际观众。为了取得成功&#xff0c;这些产品必须具有功能性和创新性&#xff0c;并提供无缝、精致的体验&#xff0c;与全球用户产生共鸣。实现这一目标的一个关键组成部分是高质量的翻…

Gartner发布2024年中国安全技术成熟度曲线:17项网络安全技术发展和应用现状及趋势

采用生成式人工智能等颠覆性技术需要增加安全投资&#xff0c;而中国企业仍然面临预算限制。首席信息官及其安全和风险管理主管可以使用此技术成熟度曲线来识别和采用合适的安全实践。 需要知道什么 2024 年&#xff0c;在中国运营的企业将继续面临预算限制。预算平均增长2.8%…

滑动输入条、进度条

参考: Antdv Slider 滑动输入条Element Plus Progress 进度条 开发时遇到一个需求&#xff0c;一个进度条控制多个视频播放器。正常使用一些组件库自带的组件就好了——antdv的slider 但是使用change事件的话&#xff0c;使用拖拽进度点改变进度条value 就会频繁触发&#x…