SpringBoot-基础篇03

之前搭建了整个开发环境实现了登录注册,springBoot整合mybatis完成增删改查,今天完成分页查询,使用阿里云oss存储照片等资源,后期会尝试自己搭建分布式文件系统来实现。

一,SpringBoot+Mybatis完成分页查询

        1,导入分页插件坐标,我们需要使用分页插件帮助我们实现分页查询:

<!--引入pageHelper依赖-->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version>
</dependency>

        2,实现controller层代码如下:

//文章列表(分页查询)
@GetMapping
public Result<PageBean<Article>> getArticleByPage(Integer pageNum,Integer pageSize,@RequestParam(required = false) Integer categoryId,@RequestParam(required = false) String state
){PageBean<Article> pageResult=articleService.getArticleByPage(pageNum, pageSize,categoryId,state);return Result.success(pageResult);
}

        在这里前端传递四个参数,前两个参数pageNum和pageSize是前端传递的分页的页数和每页的记录数,后两个参数是分页查询需要的条件,需要注意的是,分页查询的条件可能不是必须的,于是我们加入RequestParam注解,将参数required改为false,标注传递的该参数不是必须的,之后就调用service层进行具体的代码实现:

3,service层实现:

//实现文章分页查询
public PageBean<Article> getArticleByPage(Integer pageNum, Integer pageSize,Integer categoryId, String state) {//用于封装返回的数据PageBean<Article> pbResult=new PageBean<>();//调用pagehelp插件开启分页查询PageHelper.startPage(pageNum,pageSize);//调用mapper层进行查询//查询的时候只能是登录用户查询自己的文章Integer userId=ThreadLocalUtil.getId();List<Article> articleList=articleMapper.list(categoryId,state,userId);//将当前查询的所有文章数据强制转化为分页插件提供的Page类,指定泛型为文章类Page<Article> articlePage= (Page<Article>) articleList;//及那个page中的数据封装金PageBean中返回pbResult.setTotal(articlePage.getTotal());pbResult.setItems(articlePage.getResult());return pbResult;
}

        在上述代码中,实现分页查询之前我们需要先调用pageHelp插件开启分页查询,也就是是 PageHelper.startPage(pageNum,pageSize);传递进去查询的页数和每页记录数,之后调用mapper进行查询,查询完之后返回结果,这时候插件的作用就体现出来了,我们直接将查询出来的结果封装在pageHelper插件提供的page对象中,(我这里代码直接强转),这时候,插件就会自动将我们查询的结果处理好,最后直接封装返回即可

4,mapper层实现:

由于参数的不确定,我们这里不使用注解开发,使用xml文件编写动态sql来实现

ArticleMapper实现:

//进行文章的分页查询
List<Article> list(Integer categoryId, String state, Integer userId);

ArticleMapper.xml实现:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.qmlx.mapper.ArticleMapper"><!--命名空间加载映射接口--><!--User selectById();--><select id="list" resultType="com.qmlx.pojo.Article">select * from article<where><if test="categoryId!=null">category_id=#{categoryId}</if><if test="state!=null">and state=#{state}</if>and create_user=#{userId}</where>and create_user=#{userId}</select></mapper>

在上述代码中,ArticleMapper.xml文件的位置要和ArticleMapper在同一个目录之下,一般放在resources目录下,结构如下:

注意在resources目录下创建的是目录,所以不能使用 . 的方式,例如我这个目录创建的使用应该是com/qmlx/mapper/ArticleMapper.xml,不能是com.qmlx.mapper.ArticleMapper.xml.并且在xml文件中需要指定id以及resultType,也就是mapper中对应的方法以及返回的类型:

<select id="list" resultType="com.qmlx.pojo.Article">

之后,书写sql,查询完毕返回即可!!

二,SpringBoot+阿里云oss存储图片:

        在项目实现中会经常遇到图片,音视频文档等大文件,需要耗费大量的存储资源,那图片举例,例如我们在项目中需要存储用户头像,这种资源比较耗费存储空间,于是在存取到数据库的时候我们一般存图片的url,图片本身存储在有公网地址的服务器上,也就是互联网上的大型计算机(不知道这个说法对不对,大概这个意思吧,我的理解),到时候我们只需访问图片对应的这个地址,就可以获取到这张图片 ,而这种互联网上的计算机就叫云,他对外提供了很多服务,例如云计算,云数据库等等,我们本次使用的是阿里云提供的云存储服务(oss)。

实现方法:

1,注册阿里云账号开通对象存储服务(oss),这个不过多解释,百度即可。

2,在oss管理控制台页面新建bucket也就是一个存储空间

新建Bucket,命名为 hmleadnews ,读写权限为 公共读,注意bucket名称如果重复,换一个即可

3,获取AccessKey

点击你的头像,点击方框获取之后一定记得复制保存,复制保存,后面要用

4,编写代码

这里的代码我已经封装在一个工具类里面,你只需要做两步

第一步,导入坐标 

<!--阿里云依赖-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>

注意,我这里是java9版本以上使用的坐标其余版本卡参考阿里云官方手册:

安装OSS Java SDK_对象存储(OSS)-阿里云帮助中心 (aliyun.com)

第二步,copy我的工具类:

public class AliOssUtil {private static final String ENDPOINT = "";private static final String ACCESS_KEY_ID = "";private static final String SECRET_ACCESS_KEY = "";private static final String BUCKET_NAME = "";//上传文件,返回文件的公网访问地址public static String uploadFile(String objectName, InputStream inputStream){// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(ENDPOINT,ACCESS_KEY_ID,SECRET_ACCESS_KEY);//公文访问地址String url = "";try {// 创建存储空间。ossClient.createBucket(BUCKET_NAME);ossClient.putObject(BUCKET_NAME, objectName, inputStream);url = "https://"+BUCKET_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}return url;}
}

注意,前面四个静态常量对应的值要修改为你自己的,该方法传递两个参数 objectName,和 inputStream分别是存储文件的名称以及该文件前端传递的输入流,具体传递形式详见controlller层代码。

第三步,编写controller

@RestController
public class FileUploadController {@PostMapping("/upload")public Result upload(MultipartFile file) throws IOException {//获取文件原始名String originalFilename = file.getOriginalFilename();//保证文件名不重复String filename= UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));//调用工具类将文件存储在阿里云上String url = AliOssUtil.uploadFile(filename, file.getInputStream());//将文件存储在本地磁盘上//file.transferTo(new File("D:\\桌面\\upload\\"+filename));return Result.success(url);}
}

注意,前端采用post方式类型为file,编码为multipart/form-data,后端接受类型为MultipartFile  ,其余代码不用修改即可!其余功能可参考阿里云官方手册!!

马上过年了,贪玩了,更新有点小慢,不过还是要坚持下去!!!

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

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

相关文章

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…

【Linux】构建模块

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f94a;不要让自己再留有遗憾&#xff0c;加油吧&#xff01; 文章目录 构建第一个模块1模块的makefile2内核树内构建3内核树外构建 构建第一个模块 可以在两个地方构建模…

【Spring】Spring 对 Ioc 的实现

一、Ioc 控制反转 控制反转是一种思想 控制反转是为了降低程序耦合度&#xff0c;提高程序扩展力&#xff0c;达到 OCP 原则&#xff0c;达到 DIP 原则 控制反转&#xff0c;反转的是什么&#xff1f; 将对象的创建权利交出去&#xff0c;交给第三方容器负责 将对象和对象之…

Windows下搭建Redis Sentinel

下载安装程序 下载Redis关于Windows安装程序&#xff0c;下载地址 下载成功后进行解压&#xff0c;解压如下&#xff1a; 配置redis和sentinel 首先复制三份redis.windows.conf&#xff0c;分别命名为&#xff1a;redis.6379.conf、redis.6380.conf、redis.6381.conf&…

C++笔记之regex(正则表达式)

C++笔记之regex(正则表达式) ——2024-02-10 ——《C++标准库》(第2版,侯捷译) Page 717 code review! 文章目录 C++笔记之regex(正则表达式)例1:使用正则表达式进行搜索(`std::regex_search`)例2:使用正则表达式进行全文匹配(`std::regex_match`)例3:使用正则表达式…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…

分享3款开源免费好用的Docker可视化管理工具安装部署教程

文章目录 1.前言2.Docker Desktop3.Portainer3.1 Portainer默认英文版本安装3.2 Portainer汉化版本安装3.3官方镜像说明3.3.1ssl访问3.3.2Nginx反代3.3.3Nginx反代设置子目录3.3.4docker-compose部署 3.4登录 4.DockerUI4.1简介4.2项目地址4.3部署启动命令4.4登录4.5首页 5.总结…

vue day06

1、路由模块封装 2、声明式导航 实现导航高亮效果 直接通过这两个类名对相应标签设置样式 点击a链接进入my页面时&#xff0c;a链接 我的音乐高亮&#xff0c;同时my下的a、b页面中的 我的音乐也有router-link-active类&#xff0c;但没有精确匹配的类&#xff08;只有my页…

Android 粒子喷泉动效

一、前言&#xff1a; 在学习open gl es实现动效的时候&#xff0c;打算回顾了一下用普通的2D坐标系实现粒子效果和 open gl 3d 坐标系的区别&#xff0c;以及难易程度&#xff0c;因此本篇以Canvas 2D坐标系实现了一个简单的demo。 粒子动效原理&#xff1a; 粒子动效本质上…

读完《王志纲谈生涯规划》后感

(点击即可收听) 经常在短视频刷到,这位王志钢老师,在微信读书里面也看到过,于是拜读了一下,这是一本生涯规划书,但更多的是他个人经历的一个描述 有大道理&#xff0c;有些话还是值得认可的 比如&#xff1a;他谈到,想要减少个人乃至社会的悲剧&#xff0c;最好的办法就是尽自己…

svg基础(八)滤镜-feTurbulence(湍流)

feTurbulence&#xff1a;湍流滤镜 湍流滤镜&#xff0c;不稳定气流&#xff0c;能够实现半透明的烟熏或波状图像。 通常用于实现一些特殊的纹理。滤镜利用 Perlin 噪声函数创建了一个图像。噪声在模拟云雾效果时非常有用&#xff0c;能产生非常复杂的质感&#xff0c;利用它可…

【Unity】QFramework通用背包系统优化:使用Odin优化编辑器

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第四章时&#xff0c;笔者使用了Odin插件&#xff0c;对Item和ItemDatabase的SO文件进行了一些优化&#xff0c;使物品页面更加紧凑、更易拓展。 核心逻辑和功能没有改动&#xff0c;整体代码量减少…

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…

springboot原理

springboot是基于Spring Framework升级的框架从而更加高效的开发主要体现在依赖配置的简化 springboot的起步依赖通过maven依赖传递包含了开发需要的依赖

【Linux】学习-基础IO—下

Linux基础IO—上 重定向 通过上篇的学习&#xff0c;我们了解了文件描述符的分配规则是遍历指针数组&#xff0c;用没有被使用的最小下标作为新的文件描述符&#xff0c;也就是我们可以通过关闭三个标准流文件并使用他们原先所占用的0&#xff0c;1&#xff0c;2描述符。 那…

探索设计模式的魅力:代理模式揭秘-软件世界的“幕后黑手”

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 引言 一、魔法世界 1.1 定义与核心思想 1.2 静态代理 1.3 动态代理 1.4 虚拟代理 1.5 代理模式结构图 1.6 实例展示如何工作&#xff08;场景案例&#xff09; 不使用模式实现 有何问题 使用模式重构示例 二、…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#xff0c…

osg模型的平移、缩放、旋转

加载2个模型&#xff0c;其中一个向上移动28个单位&#xff1b; 加载2个模型&#xff0c;其中一个缩放0.5倍&#xff0c;向下移动22个单位&#xff1b; 加载2个模型&#xff0c;其中一个缩放0.5倍、旋转45度、向右向下移动几个单位&#xff1b; 都是用矩阵实现的&#xff1b; …

【笔记】Harmony学习:下载安装 DevEco Studio 开发工具IDE

IDE 安装 从官网下载DevEco Studio 安装包后进行安装&#xff0c; 安装完毕后&#xff0c;本地环境可能要配置相关工具&#xff0c;可以通过下面的诊断检测一下本地环境&#xff0c;通过蓝色“Set it up now” 可以快速安装。 1. Node.js (for ohpm) 2. ohpm 下载op的包管理&a…

Codeforces Round 923 (Div. 3) C. Choose the Different Ones(Java)

比赛链接&#xff1a;Round 923 (Div. 3) C题传送门&#xff1a;C. Choose the Different Ones! 题目&#xff1a; ** Example** ** input** 6 6 5 6 2 3 8 5 6 5 1 3 4 10 5 6 5 6 2 3 4 5 6 5 1 3 8 10 3 3 3 4 1 3 5 2 4 6 2 5 4 1 4 7 3 4 4 2 1 4 2 2 6 4 4 2 1 5 2 3 …