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.mzph.cn/news/670364.shtml

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

相关文章

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通&#xff0c;系统化的编程视频教程上线&#xff0c;中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…

mysql事务锁

Lock - 事务锁 与 latch 的区别 lock对象是事务&#xff0c;用来锁定的是数据库中的对象&#xff0c;如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放&#xff08;不同事务隔离级别释放的时间可能不同&#xff09;。此外&#xff0c;lock&#xff0c;正…

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作&#xff0c;创建三台虚拟机环境并安装好 java 开发工具包 JDK&#xff0c;可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境&#xff0c;本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…

发送get请求并且发送请求头(header),java实现

发送get请求时&#xff0c;发送请求头&#xff08;Header&#xff09;中的内容 方便第二次调用其他url时传递参数&#xff0c;例如userCode或者租户编码 调用方式 Autowired private HttpServletRequest request;先注入HttpServletRequestpublic xxx xxx(){String url &quo…

docker程序镜像的制作

目录 一、每种资源的预安装&#xff08;基础&#xff09; 安装 nginx安装 redis 二、dockerfile文件制作&#xff08;基础&#xff09; 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像&#xff08;方式一&#xff09; 生成centos容器并…

vue3+echarts:Vue中使用echarts从后端获取数据并赋值显示

//由于前后端交互,所以使用axios发送请求 const Count ref(null); //设备种类数值 const Name ref(null); //设备种类名称 //设备种类 饼图 const pieChart () > {const getpieChart echarts.init(document.getElementById("deviceKind"));// 创建图标getpieC…

位置内插 PI:基于Positional Interpolation扩大模型的上下文窗口

位置内插 PI&#xff1a;基于Positional Interpolation扩大模型的上下文窗口 如何在不牺牲性能或从头训练的情况下&#xff0c;扩展大型语言模型的上下文窗口以处理长文档或长对话&#xff1f; 论文&#xff1a;https://arxiv.org/pdf/2306.15595.pdf 这篇论文介绍了一种名为位…

C++ JSON解析

JSON解析 JSONCPPC实现JSON解析器 JSONCPP JSONCPP源码链接&#xff1a;https://github.com/open-source-parsers/jsoncpp JSOCPP源码下载以后&#xff0c;首先复制一份include文件夹下的json文件夹&#xff0c;头文件留着后续备用。 使用Cmake生成项目。在IDE中编译jsoncpp_…

【Nicn的刷题日常】之打印整数二进制的奇数位和偶数位

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 获取一个整数二进制序列中所有的偶数位和奇数位&#xff0c;分别打印出二进制序列 2.解题思路 1. 提取所有的奇数位&#xff0c;如果该位是1&#xff0c;输出1&#xff0c;是0则输出0 2. 以同样的方式提取偶数位置检测n…

CGAL-3D 凸包算法

3D 凸包算法 一、概述二、静态凸包构造1. Traits 特征类2. 极端点3. 半空间相交4. 凸性检验 三、动态凸包构造四、性能 一、概述 一个点集 S∈R3 是凸的&#xff0c;如果对于任意两点 p 和 q 在集合中&#xff0c;具有端点的线段 p 和 q 包含在 S。集合的凸包 P 包含点集 S 的最…

GADM 4.1 全球国家行政区划下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复g004&#xff0c;领取最新 GADM 4.1 全球国家行政区划 GADM概述 GADM&#xff0c;全称 Database of Global Administrative Areas&#xff0c;是一个开放获取的全球行政区划数据库&#xff0c;包含各国、…

APIfox编排自动化测试场景(一)

测试场景用于将多个接口请求与实际可能发生的一些特殊情况&#xff08;如条件判断、循环&#xff09;有序的组合在一起&#xff0c;来模拟一个真实业务流程&#xff0c;组成自动化测试单元。 新建目录 / 测试场景​ 打开 Apifox 后点击左侧菜单栏中的“自动化测试”&#xff…

基于Vue的移动端UI框架整理

一、Vant 官方地址&#xff1a;https://youzan.github.io/vant/#/zh-CN/ 简介&#xff1a;有赞公司开发。 特性&#xff1a;60 高质量组件、90% 单元测试覆盖率、完善的中英文文档和示例、支持按需引入、支持主题定制、支持国际化、支持 TS、支持 SSR。 特别说明&#xff1…

机器学习---概率图模型(隐马尔可夫模型、马尔可夫随机场、条件随机场)

1. 隐马尔可夫模型 机器学习最重要的任务是根据已观察到的证据&#xff08;例如训练样本&#xff09;对感兴趣的未知变量&#xff08;例如类别标 记&#xff09;进行估计和推测。概率模型&#xff08;probabilistic model&#xff09;提供了一种描述框架&#xff0c;将描述任…

R语言阈值效应函数cut.tab2.0版发布(支持线性回归、逻辑回归、cox回归,自定义拐点)

阈值效应和饱和效应是剂量-反应关系中常见的两种现象。阈值效应是指当某种物质的剂量达到一定高度时&#xff0c;才会对生物体产生影响&#xff0c;而低于这个剂量则不会产生影响。饱和效应是指当某种物质的剂量达到一定高度后&#xff0c;其影响不再随剂量的增加而增加&#x…

编译DuiLib库遇到的变量定义位置问题

C89 规定&#xff0c;所有局部变量都必须定义在函数开头&#xff0c;在定义好变量之前不能有其他的执行语句&#xff1b; C99 标准取消这这条限制&#xff0c;但是 VC/VS 对 C99 的支持不是很积极&#xff1b; C99 是 C89 的升级版&#xff1b; 如图是修改之后的代码&#xff1…

AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺

今天分享的是AI 系列深度研究报告&#xff1a;《AI专题&#xff1a;海外科技巨头指引&#xff0c;AI主线逻辑依旧坚挺》。 &#xff08;报告出品方&#xff1a;华西证券&#xff09; 报告共计&#xff1a;54页 本周热点:海外科技巨头指引&#xff0c;AI主线逻辑依旧坚挺 硬件…

介绍docker

一&#xff1a;介绍docker&#xff1a; Docker 并没有单独的图形界面&#xff0c;它主要通过命令行来进行管理和操作 1、 docker ps&#xff1a;显示正在运行的容器。 docker images&#xff1a;显示本地的镜像。 docker run&#xff1a;创建并启动一个新容器。 docker stop&a…

高速接口PCB布局指南(二)通用高速信号布线

高速接口PCB布局指南&#xff08;二&#xff09;通用高速信号布线 1.PCB材料编织2.高速信号布线长度3.高速信号布线长度匹配4.高速信号参考平面 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.PCB材料编织 在常见的 PCB 材料上为差分信号布线时&#xff0c;…