项目知识—SSM及之后02

1、resultMap写的Base内容必须保证select都使用上

2、VALUE单个 ,VALUES多个

3、一对多,两张表,多的表加外键

比如班级和学生就是一对多,查就是按照学生表去查询

多对多,三张表,关系表加外键

4、数据库起名的时候,有关联的表的字段如果是相同的话一定要区分开来,命名不要一样,不然会出现值覆盖问题,可以一个叫name 一个叫dname 

5、If 0、不成功都要抛异常(throw new)

6、swagger的使用(都是提供说明的)

(1)Controller上

@Api(tags = "购物车Api接口")用于为API或API的某个部分提供一个标签或分类
@ApiOperation("新增购物车记录")用于为API操作提供一个简短的描述或标签
 @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "页码", defaultValue = "1"),
            @ApiImplicitParam(name = "size", value = "条数", defaultValue = "2"),
            @ApiImplicitParam(name = "userId", value = "用户id")
    })
用于为API参数提供更多元数据和描述集合。
@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1")用于为API参数提供更多元数据和描述

(2)实体类上

@ApiModel("回收类")用于为API模型或模型类提供一个描述或标签
@ApiModelProperty("商品名称")描述API模型属性的元数据

7、@ApiModelProperty(用于Java类中定义API模型属性)

value用于提供模型属性的描述。例如,@ApiModelProperty(value = "商品名称")
required用于指定模型属性是否必需。如果设置为 true,则该属性是必需的。如果设置为 false,则该属性是可选的。例如,@ApiModelProperty(value = "商品描述", required = true)
example用于提供模型属性的示例值。这对于展示如何使用该属性非常有用。例如,@ApiModelProperty(value = "商品ID", example = "123456")
notes用于提供关于模型属性的额外说明或备注。例如,@ApiModelProperty(value = "商品ID", notes = "请使用唯一的商品ID")
dataType用于指定模型属性的数据类型。例如,@ApiModelProperty(value = "商品价格", dataType = "double")

 8、六种类型参数传递

普通参数直接传(或json)
请求参数名与形参变量名不匹配使用@RequestParam绑定参数关系
实体类参数直接传属性(非json)
嵌套pojo对象按照对象层次结构关系接收 address.city
数组参数key相同这样去传递(k1 值1;k2 值2)
集合保存普通参数使用@RequestParam(属性注解)绑定参数关系,其他跟数组一样

1)实体类参数:直接传属性

2)嵌套pojo对象:按照对象层次结构关系接收 address.city

3)数组参数:key相同这样去传递

还可以这样 

4)集合保存普通参数:使用@RequestParam(属性注解)绑定参数关系,其他跟数组一样

9、swagger路径

http://localhost:8080/api/doc.html#/home

自动配置

10、时间类型处理

(1)普通请求@DateTimeFormat

@GetMapping("/test1")
public String testDate(@DateTimeFormat(pattern = "HH:mm:ss") Date createDate) {
    return "接受客服端String类型的时间类型  转化Date类型";
}

(2)请求参数是json

        1)@JsonFormat 局部配置

@Data
public class UserQo {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
}
@PostMapping("/test2")
public String testDateJson(@RequestBody UserQo userQo) {
    System.out.println(userQo.getCreateDate().toString());
    return "Json时间处理";
}

        2)全局配置

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="dateFormat">
                        <bean class="java.text.SimpleDateFormat">
                            <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

(3)响应时间

统一时间json方式

11、关于删除错了想要恢复

选中历史版本再恢复就可以了 

12、查询指定条件下的指定条件的话,嵌套就嵌套传递就可以了,sql语句where那里做判断就行

13、浏览器图片的上传下载显示通过数据库实现

<!-- 文件上传配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760" />
</bean>

<!-- 文件下载配置 -->
<mvc:resources mapping="/download/**" location="file:/D:/uploads/" />

(1)图片上传

@Controller
@RequestMapping("/upload")
public class UploadController {

    @RequestMapping(value = "/image", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(@RequestParam("file") MultipartFile file) {
        String fileName = file.getOriginalFilename();
        String path = "D:/uploads/" + fileName;
        try {
            File dest = new File(path);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            file.transferTo(dest);
            return "success";
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
    }
}

 在控制层中,我们创建一个名为UploadController的类来处理上传请求。在该类中,我们需要添加一个方法,该方法用于处理上传请求并返回上传结果。在该方法中,我们需要使用SpringMVC提供的 MultipartResolver 类来解析上传的文件,获取文件信息,并将文件保存到服务器上

(2)图片下载

@Controller
@RequestMapping("/download")
public class DownloadController {

    @RequestMapping(value = "/image/{id}", method = RequestMethod.GET)
    public ResponseEntity<byte[]> downloadImage(@PathVariable("id") int id) {
        Image image = imageService.getImageById(id);
        String fileName = image.getName();
        String path = "D:/uploads/" + fileName;
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", fileName);
            File file = new File(path);
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

我们使用了 imageService.getImageById(id) 方法来获取要下载的图片的信息,这个方法可以自己实现或借助MyBatis框架读取数据库获取数据。

其中,id 为图片在数据库中的对应主键,response 为响应对象,conn 为数据库连接对象。通过操作 ResultSet 对象可以得到图片数据的输入流。

14、浏览器图片的上传下载显示通过数据库实现

(1)将图片添加到数据库

CREATE TABLE tb_image(
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `name` varchar(255) NOT NULL COMMENT '文件名',
    `image` longblob NOT NULL COMMENT '图片数据',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片表';
public void addImage(String name, String imagePath) {
    try {
        FileInputStream fis = new FileInputStream(imagePath);
        PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tb_image(name,image) VALUES(?,?)");
        pstmt.setString(1, name);  // 设置文件名
        pstmt.setBinaryStream(2, fis, fis.available());  // 设置图片数据
        pstmt.executeUpdate();
        pstmt.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

(2)从数据库读取到前端页面

public void getImage(int id, HttpServletResponse response) {
    try {
        PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM tb_image WHERE id=?");
        pstmt.setInt(1, id);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            String name = rs.getString("name");
            Blob imageBlob = rs.getBlob("image");
            InputStream is = imageBlob.getBinaryStream();
            ServletOutputStream out = response.getOutputStream();
            response.setContentType("image/jpeg");
            response.setHeader("Content-Disposition", "attachment;filename=" + name);
            byte[] b = new byte[1024];
            int len;
            while ((len = is.read(b)) > 0) {
                out.write(b, 0, len);
            }
            is.close();
            out.flush();
            out.close();
        }
        rs.close();
        pstmt.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

15、图片上传 (正确)

  • 首先,从上传的文件中获取原始文件名。
  • 获取文件上传的路径。
  • 获取文件扩展名的子字符串(例如,从"example.jpg"中获取".jpg")。
  • 生成一个新的文件名,该文件名由UUID和原始文件的扩展名组成。
  • 检查目标文件夹是否存在,如果不存在则创建它。
  • 尝试将上传的文件转移到目标文件夹,并重命名为新生成的文件名。
  • 如果文件转移成功,返回一个表示成功的ResponseResult对象,其中包含新生成的文件名。
  • @PostMapping("/image/upload")
        @ApiOperation("上传车辆信息相关图片")
        @ApiResponses({@ApiResponse(code = 2000, message = "成功", response = String.class), @ApiResponse(code = 4000, message = "未知错误)")})
        public ResponseResult<String> upload(@RequestBody MultipartFile pic,HttpServletRequest request){
            String originalFilename = pic.getOriginalFilename();
            String realPath=request.getServletContext().getRealPath("WEB-INF/upload/carInfoImg");
            String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
            String fileName = UUID.randomUUID().toString()+substring;
            File dir = new File(realPath);
            if (!dir.exists()){
                dir.mkdirs();
            }
            try {
                pic.transferTo(new File(realPath,fileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return ResponseResult.success(fileName);
        }

16、图片回显(postman显示)(正确)

该方法通过将图片数据写入 HTTP 响应的输出流来实现图片的回显

  • 首先,从请求中获取图片文件的真实路径。
  • 创建一个FileInputStream来读取该文件。
  • 设置HTTP响应的内容类型为"image/jpeg",表示响应的内容是一个JPEG图片。
  • 使用循环从输入流中读取数据,并写入到输出流中,从而将图片数据发送给客户端。这里使用了缓冲区以提高效率。
  • 关闭输出流和输入流。
   @GetMapping("/image/download")
    @ApiOperation("图片下载回显")
    @ApiResponses({@ApiResponse(code = 2000, message = "成功", response =File.class), @ApiResponse(code = 4000, message = "未知错误)")})
    public void download(String pname, HttpServletResponse response,HttpServletRequest request){
        try {
            String realPath=request.getServletContext().getRealPath("WEB-INF/upload/carInfoImg/");
            //获取图片文件
            FileInputStream inputStream = new FileInputStream(new File(realPath+pname));
            //输出流
            ServletOutputStream outputStream = response.getOutputStream();

            response.setContentType("image/jpeg");

            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = inputStream.read(bytes)) != -1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
            outputStream.close();
            inputStream.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

17、上传下载图片流程

(1)js实现

$(function(
  $("#uploadBtn").click(function(){
    // 获取上传文件
    var uploadPhoto = $("#upload")[0].files[0];
    // 利用FormDate对象封装文件数据
    var formdata = new FormData();
    formdata.append("uploadPhoto",uploadPhoto);
    $.ajax({
        url:'regUpload',
        type:'post',
        processData:false,
        contentType:false,//设置false,将请求数据类型设置为multipart/form-data
        data:formdata,
        success:function(data){
           if(data.result){
            alert("上传成功!");
            $("#imageSpan").html("<img src='<%=basePath%>"+data.msg+"' width='100px' />");
            $("#imgPath").val(data.msg);
            }else{
                alert("上传失败!原因:"+data.msg);
            } 
        }
    });
  });
    
));

(2)图片上传

@RequestMapping("regUpload")
@ResponseBody
public Result regUpload(MultipartFile uploadPhoto, HttpServletRequest request) throws IOException {

    // 业务处理
    // 1、获取文件在服务器存储中的实际路径
    String realPath = request.getServletContext().getRealPath("/uploadImage/");
    File pathFile = new File(realPath);
    if(!pathFile.exists()){
        pathFile.mkdirs();
    }
    // 2、获取文件原始文件名,随机生成文件名
    String originalFilename = uploadPhoto.getOriginalFilename();

    String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

    String fileName = UUID.randomUUID()+suffix;
    // 3、实际路径拼接随机文件名,将文件存储至目标路径
    uploadPhoto.transferTo(new File(realPath+fileName));

    // 4、存储文件的原始名、随机名、文件类型至数据库
    String contentType = uploadPhoto.getContentType();
    PhotoImage photoImage = new PhotoImage("/uploadImage/"+fileName, originalFilename, fileName, contentType );
    System.out.println("============================");
    int flag = 0 ;
    try{
        flag =photoImageService.insertImage(photoImage);
    }catch (Exception e){
        e.printStackTrace();
    }
    if(flag==1){
        // 5、返回上传结果、存储路径+文件名
        Result result = new Result(true,"uploadImage/"+fileName);
        return result;
    }else{
        return new Result(false,"图片存储失败!");
    }
}

(3)图片下载

@RequestMapping("downloadFile")
public void downloadFile(String filename,HttpServletRequest req, HttpServletResponse resp) throws IOException {
    // Step2 后台接收请求,先设置响应头,表明为下载请求
    resp.setHeader("Content-Disposition", "attachment;filename="+filename);
    // Step3 获取文件的在硬盘上的绝对路径
    String realPath = req.getServletContext().getRealPath("/uploadImage/");
    // Step4 利用FileUtils将文件转成byte数组
    File file = new File(realPath,filename);
    byte[] bytes = FileUtils.readFileToByteArray(file);
    // Step5 从相应对象中获取输出流,将byte数组写出
    ServletOutputStream os = resp.getOutputStream();
    os.write(bytes);
    // Step6 清除输出流的缓存、关闭输出流
    os.flush();
    os.close();
}

18、可以在用户那里嵌套去筛选条件

<!--            城市模糊查询-->
            <if test="user.userDetail.city != null and user.userDetail.city != ''">
                AND d.city LIKE CONCAT('%', #{user.userDetail.city}, '%')
            </if>

19、设置了唯一字段然后又去找的话就只会出来一条

20、分页的工具类total是按查询出的条数来的

total看总条数,用user还是List<User>看查单User的多少条信息(因为多表都是由user牵扯出来的)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov8实战第五天——yolov8+ffmpeg实时视频流检测并进行实时推流——(推流,保姆教学)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客 yolov8实战第三天——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09;-CSDN博客 今天&#xff0c;我们继续y…

深度解析 Compose 的 Modifier 原理 -- DrawModifier

其实原理性分析的文章&#xff0c;真的很难讲的通俗易懂&#xff0c;讲的简单了就没必要写了&#xff0c;讲的繁琐难懂往往大家也不乐意看&#xff0c;所以只能尽量想办法&#xff0c;找个好的角度&#xff08;比如从 Demo 代码示例出发&#xff09;慢慢带着大家去钻源码&#…

Linux查看物理CPU个数、核数、逻辑CPU个数

文章目录 总核数总逻辑CPU数查看物理CPU个数查看每个物理CPU中core的个数(即核数)查看逻辑CPU的个数 总核数 总核数 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep “…

湖南大学-数据库系统-2015期末考试解析

【写在前面】 这是2015年的卷子&#xff0c;应该是我能找到最老的一张了&#xff0c;遂做了并与同学校对了答案。答案仅供参考。这张难度不大&#xff0c;都是基础题。 一.单选题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09; 1、在数据库中&#xff0c;下列说法&a…

企业工商基本信息API:一站式掌握企业核心数据

引言 在当今快速发展的商业环境中&#xff0c;了解企业的基本信息是每个业务决策者的基本需求。然而&#xff0c;手动收集和处理这些信息既耗时又容易出错。企业工商基本信息查询API的出现&#xff0c;为企业提供了一个高效、准确的一站式解决方案。 企业工商基本信息API 企…

win10录音功能大盘点,帮你轻松搞定录音

“有人知道win10系统怎么录音吗&#xff1f;在网上找到了一段英语听力&#xff0c;本来打算保存下来&#xff0c;但是发现不能下载&#xff0c;我也不会使用电脑录音&#xff0c;真的很头疼&#xff0c;有人能帮帮我吗。” 在Windows 10系统中&#xff0c;录音是一项常见但往往…

PPT插件-布局参考-增加便携尺寸功能

PPT自带的尺寸为很久的尺寸&#xff0c;很多尺寸不常用&#xff0c;这里增加一些画册尺寸&#xff0c;用于PPT排版设计。 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持Wps Word和Office Word&#x…

Python——字符串的拼接

print("某某程序员" "月薪过万") name "吱昂张程序员" address "**大学" tel 19819208830 print("我是:"name"我的地址在&#xff1a;"address)#通过占位的形式完成字符串换的拼接 name"吱昂张" me…

【项目实战】Cadence工具的使用2

代码覆盖率的收集 双击total&#xff0c;打开imc工具。total 下的文件是代码覆盖率文件 找到DUT模块&#xff01;从图中可以看到代码的覆盖率已经是94.43% 添加exclude文件&#xff0c;注意和Synopsys的后缀不同。 导入.vRefine文件 代码覆盖率为100%。 原因是我们添加了exclu…

VS2022 | 调整适配虚幻5的设置

VS2022 | 调整适配虚幻5的设置

Spring学习 Spring事务控制

7.1.事务介绍 7.1.1.什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不…

工业自动化中RFID标签的应用案例

RFID标签是实现RFID数据采集的重要载体&#xff0c;利用RFID标签&#xff0c;可以将所有产品的信息写入标签中&#xff0c;大部分的RFID标签都以不干胶标签的形式使用&#xff0c;只需要在物品包装上贴RFID标签就可以。下面我们就一起来了解一下&#xff0c;工业自动化中RFID标…

编程代码设计GUI界面

前情提要 GUI界面有元件拖动和编程代码两种设计方式&#xff0c;元件拖动比较直观&#xff0c;编程代码更加细致。本来搞了一个包含各种元件的项目&#xff0c;最后发现代码比较长&#xff0c;一下子扔出来对初学者非常不友好&#xff0c;所以我们分开一段一段来添加&#xff…

Eureka注册中心Eureka提供者与消费者,Eureka原理分析,创建EurekaServer和注册user-service

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Eureka提供者与消费者二、Eureka原理分析eurekaeureka的作用eureka总结 三、创建EurekaServer和注册user-service创建EurekaServer总结 服务的拉取总结-Eur…

Adding Conditional Control to Text-to-Image Diffusion Models——【论文笔记】

本文发表于ICCV2023 论文地址&#xff1a;ICCV 2023 Open Access Repository (thecvf.com) 官方实现代码&#xff1a;lllyasviel/ControlNet: Let us control diffusion models! (github.com) Abstract 论文提出了一种神经网络架构ControlNet,可以将空间条件控制添加到大型…

Spark---RDD(双值类型转换算子)

文章目录 1.RDD双值类型算子1.1 intersection1.2 union1.3 subtract1.4 zip 1.RDD双值类型算子 RDD双Value算子就是对两个RDD进行操作或行动&#xff0c;生成一个新的RDD。 1.1 intersection 对源 RDD 和参数 RDD 求交集后返回一个新的 RDD 函数定义&#xff1a; def inters…

在macos上查看当前进程的栈信息

概述 在调试程序时&#xff0c;如cpu莫名的高或低&#xff0c;一个常用的方式就是打印当前进行的调用栈&#xff0c;然后确认各线程的执行函数是否有异常。 在linux系统中可以使用pstack命令&#xff0c;直接打印各线程的栈信息&#xff0c;可惜在macos上没有该命令。一种解决…

了解VR虚拟现实的沉浸式效果及其技术特点!

VR虚拟现实体验装置作为近年来人气火爆的科技产品&#xff0c;以其独特的沉浸式体验效果吸引了众多用户&#xff0c;那么&#xff0c;你知道这种VR体验装置是如何实现沉浸式体验效果的吗&#xff1f;它又具备了哪些技术特点呢&#xff1f; 一、真实的场景体验 VR虚拟现实技术通…

IOCDI

控制反转IOC、依赖注入DI 控制反转IOC&#xff1a;删除new对象的代码&#xff0c;交给IOC容器管理&#xff0c;加上Component 依赖注入DI&#xff1a;Autowired &#xff0c;就可以实现程序运行时IOC容器自动注入需要的依赖对象 Bean 声明bean的四大注解&#xff1a; Compon…

SSL证书安装在哪?

安装SSL证书的具体步骤取决于你使用的服务器软件和操作系统。一般来说&#xff0c;SSL证书通常用于加密网站上的数据传输&#xff0c;因此安装过程主要涉及到Web服务器的配置。以下是一般步骤&#xff0c;但请注意这可能因你的具体环境而异。 永久免费SSL证书_永久免费https证…