项目知识—SSM及之后02

news2024/9/20 9:08:31

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牵扯出来的)

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

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

相关文章

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(11)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;10&#xff09; 2.3 PCI桥与PCI设备的配置空间 PCI设备都有独立的配置空间&#xff0c;HOST主桥通过配置读写总线事务访问这段空间。PCI总线规定了三种类型的PCI配置…

在当前bash(sh)中执行脚本和注册函数

在研究《管理Python虚拟环境的脚本》时&#xff0c;我们使用了source指令而没有使用sh或者bash来执行脚本&#xff0c;就是因为source指令可以让脚本在当前bash(sh)中执行&#xff1b;而sh或者bash则会新启动一个bash来执行。 我们可以通过下面这个脚本做测试 # test.sh # 用…

上海亚商投顾:沪指再度失守2900点 全市场超4800只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日继续调整&#xff0c;沪指跌超1%再度失守2900点&#xff0c;深成指、创业板指均创出调整新低&…

图文详解:CRM系统的功能有哪些?

在如今多数行业市场充分竞争的情况下&#xff0c;同质化产品层出不穷&#xff0c;什么样的企业可以在市场中屹立不倒&#xff1f;必然是拥有广泛稳定的客户群体的企业&#xff0c;所以强大的客户关系管理能力就成为了企业的核心竞争力。 在SaaS发展到今日&#xff0c;基于云服…

MySQL之子查询、连接查询(内外)以及分页查询(实操)

文章目录 前言一、SQL脚本二、实操以及实现思路 前言 续上篇博主MySQL之视图&索引&执行计划这篇给大家讲解MySQL之子查询、连接查询(内&外)以及分页查询 一、SQL脚本 /*Navicat Premium Data TransferSource Server : localhostSource Server Type :…

前端JS加密对抗由浅入深-2

前言&#xff1a; 本文主要讲解&#xff0c;针对前端非对称、多段加密数据传输站点&#xff0c;如何进行动态调试&#xff0c;如何进行安全测试。本次讲解不涉及任何漏洞方面&#xff0c;仅为学习探讨&#xff0c;该站点现已经更改加密方式&#xff0c;严禁非法测试&#xff0…

基于SSM的校园线上订餐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;vue\html 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

振弦采集仪在桥梁结构监测中的应用研究

振弦采集仪在桥梁结构监测中的应用研究 振弦采集仪在桥梁结构监测中的应用研究是指利用振弦采集仪对桥梁结构进行监测和数据采集的研究。振弦采集仪是一种能够实时监测桥梁结构振动情况的设备&#xff0c;通过采集桥梁上的振弦传感器获取振动数据&#xff0c;并将数据传输到监…

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中&#xff0c;pydot库用于生成图形化输出&#xff0c;特别是生成.dot文件和相关的图像文件&#xff0c;如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

Git命令+github仓库克隆

Git github Git常用命令 开始 git init #创建仓库 git status #查看仓库的状态 git status -s #简单的查看仓库的状态 git ls-files #查看暂存区的内容 git reflog #查看操作的历史记录 暂存区 git add git add <file&g…

1-05使用VS调式程序

一、概述 写代码总不是一帆风顺的&#xff0c;总会碰到一些问题&#xff0c;检查问题&#xff0c;排除错误&#xff08;也就是Debug程序&#xff09;&#xff0c;对于任何程序员而言都是基本功。 我们前面讲过&#xff0c;C语言是一门很容易出错&#xff0c;且自身不提供异常…

[DM8] 达梦8配置兼容Oracle

查看版本信息 select *&#xff0c;id_code from v$version; 查询解释&#xff1a; DM Database Server 64 V8 1-1-190-21.03.12-136419-ENT 64 版本位数标识&#xff0c;64表示为64位版本&#xff0c;无64则表示为32位版本 V8 大版本号&#xff0c;目前主要是V7、V8 1-1-190…

STL——stack,queue详解

目录 &#x1f4a1;stack &#x1f4a1;基本概念 常用接口 &#x1f4a1;queue &#x1f4a1;基本概念 &#x1f4a1;常用接口 &#x1f4a1;stack &#x1f4a1;基本概念 栈&#xff08;stack&#xff09;&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…

vue3用户权限管理(路由控制等)

在前端开发的过程中&#xff0c;我们需要做前端的权限管理&#xff0c;我们需要根据后端提供的信息来控制权限&#xff0c;这时候就需要根据用户的操作来进行权限控制了。逻辑稍微有一点绕&#xff0c;多理解就好了。 用户路由权限管理 大致的实现原理&#xff1a; 一般将路由…

Java方法用法及解析

在 Java 中&#xff0c;方法&#xff08;Method&#xff09;是用于执行特定任务的代码块。它是一个函数&#xff0c;用于封装一段可重复执行的代码&#xff0c;并可以被其他代码调用。方法定义了一系列操作的步骤&#xff0c;并提供了一种结构化和可复用的方式来组织和执行这些…

机器学习原理到Python代码实现之NaiveBayes【朴素贝叶斯】

Naive Bayes 朴素贝叶斯算法 该文章作为机器学习的第二篇文章&#xff0c;主要介绍的是朴素贝叶斯算法的原理和应用。学习本章内容建议对概率论中的联合概率以及先验概率、后验概率有初步的学习和掌握。 难度系数&#xff1a;⭐⭐⭐ 更多相关工作请参考&#xff1a;Github 算法…

ELK的搭建—Elasticsearch-8.11.3的安装及集群的搭建

es的安装及其集群的搭建 一、Elasticsearch服务的安装部署1. Elasticsearch的rpm包下载2. 安装Elasticsearch服务3. 设置系统资源及内存大小分配4. Elasticsearch的配置修改 二、建立Elasticsearch集群1. 安装Elasticsearch主节点server12. 配置server1&#xff0c;及配置文件的…

Linux文件系统与日志服务管理

目录 一.Linux文件系统 1.inode表和block &#xff08;1&#xff09;inode &#xff08;2&#xff09;block 2.查看inode号命令 3.Linux系统文件三种主要时间属性 4.磁盘空间还剩余很多但无法继续创建文件 5.inode大小 二.日志 1.日志保存位置 2.日志文件的分类 &a…

Making Large Language Models Perform Better in Knowledge Graph Completion

Making Large Language Models Perform Better in Knowledge Graph Completion 基本信息 博客贡献人 鲁智深 作者 Yichi Zhang, Zhuo Chen, Wen Zhang, Huajun Chen 隶属于浙江大学计算机学院和软件学院 摘要 本文主要探讨了如何将有用的知识图谱结构信息融入大语言模型中…

使用Redhat操作系统下载MySQL

一、本地下载安装 方法一 ①在虚拟机火狐浏览器中搜索MySQL官网&#xff08;选择第一个下载&#xff09; ②下载完毕使用xshell远程连接解压及安装 [rootlocalhost ~]# cd /Downloads/ [rootlocalhost Downloads]# mkdir /mysql/ [rootlocalhost Downloads]# mv mysql-8.0.3…