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 mapper
        PUBLIC "-//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 ,其余代码不用修改即可!其余功能可参考阿里云官方手册!!

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

相关推荐
间彧16 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧16 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
零雲17 小时前
java面试:有了解过RocketMq架构么?详细讲解一下
java·面试·java-rocketmq
间彧17 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧17 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧17 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧17 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
Deamon Tree17 小时前
HBase 核心架构和增删改查
java·hbase
间彧17 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
卡卡酷卡BUG17 小时前
Java 后端面试干货:四大核心模块高频考点深度解析
java·开发语言·面试