【实战教程】Spring Boot + MyBatis Plus: 分页查询从零开始(开发必会)

基于mybatis-plus分页查询功能的实现

前言

其实分页查询的功能实现在网上随处都能查到如何去实现,但很多都是在有一定知识情况下才好跟着写,作为一个从小白什么都不懂,到如今依然是小白略懂一点,给大家分享一下实际项目开发过程中如何去实现分页查询,这里我会从0基础一步一步的去实现分页查询功能,这篇也当作我作为新人踏入这个行业的笔记。

一、建一个Spring Boot项目

打开IDEA工具选择新建一个工程选择Springboot项目
在这里插入图片描述
下一步界面要注意了,这里选择Maven工程Java版本选择8其它默认就行
在这里插入图片描述
在下一步的界面选上JDBC API和MySQL,至于Spring Web可以不选,但是既然是Spring Boot项目了怎么也要完成接口可调用嘛,这里我就选择Spring Web
在这里插入图片描述
当项目创建成功后我们找到pom文件修改一下Sping Boot的版本顺便查看Java版本是否正确,不对就进行修改。
在这里插入图片描述
在这里插入图片描述
当本版修改好了过后,我们刷新一下就行了,如果不知道怎么刷新的小小白看我下面两张截图步骤,不是小小白就可以忽略了。
在这里插入图片描述
在这里插入图片描述

二、导入依赖

<!--引入mybatis-plus依赖-->
<dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.4.1</version>
</dependency>
<!--引入mybatis-plus依赖-->

<!--引入lombok依赖-->
<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
</dependency>
<!--引入lombok依赖-->
<!--单元测试依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!--单元测试依赖-->

这里我多引入了一个lombok依赖,其实不引入也没关系,但是lombok依赖可以减少冗长的代码,使Java开发更加便捷和高效。作用就是后面写实体类的时候我就不用再去写setget等方法,加一个@Data注解就可以了。
注意:依赖添加完后要记得刷新
下面我把pom.xml文件代码全部附上并且每个依赖我都添加注释

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--单元测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--单元测试依赖-->
        <!--数据库的连接依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--数据库的连接依赖-->
        <!-- MySQL的连接依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- MySQL的连接依赖-->
        <!--引入mybatisplus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--引入mybatisplus依赖-->
        <!--引入lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <!--引入lombok依赖-->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

三、创建数据库

创建数据库的方式有两种,一种是采用SQL语句进行创建数据库和表,另一种是利用数据库的可视化工具进行创建数据库,我们采用的是SQL语句进行创建数据库。至于为什么选择SQL语句勒,是因为我觉得这样逼格高一点。
第一步打开Navicat工具
在这里插入图片描述
接下来会弹出一个查询编译器,我们将建表语句写在这里,然后执行即可。

注意:SQL语句要以英文分号结尾。
在这里插入图片描述
第一步:创建 practice_study 数据库

create database practice_study; -- 创建数据库

第二步:创建用户表 user

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
 `id`                 INT             NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
 `nickname`	    VARCHAR(255)        NULL                            COMMENT '昵称', 
 `username`           VARCHAR(255)    NOT NULL                            COMMENT '用户名',
 `password`           VARCHAR(255)    NOT NULL                            COMMENT '密码' 
) ENGINE = InnoDB
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_bin
  ROW_FORMAT = Dynamic
  COMMENT '用户表';

第三步:我们执行下面我写好的SQL语句向表里插入20条数据后面验证功能用

INSERT INTO user (nickname, username, password) VALUES
('张三', 'zhangsan', '123456'),
('李四', 'lisi', '123456'),
('王五', 'wangwu', '123456'),
('赵六', 'zhaoliu', '123456'),
('周七', 'zhouqi', '123456'),
('钱八', 'qianba', '123456'),
('孙九', 'sunjiu', '123456'),
('朱十', 'zhushi', '123456'),
('刘一', 'liuyi', '123456'),
('陈二', 'chener', '123456'),
('张三1', 'zhangsan1', '123456'),
('李四1', 'lisi1', '123456'),
('王五1', 'wangwu1', '123456'),
('赵六1', 'zhaoliu1', '123456'),
('周七1', 'zhouqi1', '123456'),
('钱八1', 'qianba1', '123456'),
('孙九1', 'sunjiu1', '123456'),
('朱十1', 'zhushi1', '123456'),
('刘一1', 'liuyi1', '123456'),
('陈二1', 'chener1', '123456');

四、连接数据库

回到IDEA工具,把application.properties文件改为application.yml

然后进入application.yml文件进行编辑,如果和我步骤一样的话,那么数据库名称哪里就写上practice_study,要把数据库名称删除换上你要连接的数据库名称

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/数据名称?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
    username: 自己数据库用户名
    password: 自己数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml

最后我们就来启动项目验证一下是否有错误
在这里插入图片描述
在这里插入图片描述

五、分页效果实现

首先我们把我图中框出来的文件包创建好
在这里插入图片描述
下面分别解释下创建的包的作用

  • config:放一些配置的类,比如等下分页功能需要用到的拦截器。
  • controller:接口层,前端通过接口类进行数据访问,数据暴露出的接口。
  • entity:实体类,基本上是一个数据库表一个实体类,里面的字段相对应创建。
  • mapper:这个包是放的service层调的数据层的接口,对数据库的操作的接口。
  • service:业务类的接口,controller层一般调用的是这个类的接口。
  • Impl:业务实现类,处理项目的业务逻辑,在项目中很重要,主要调用的是mapper中的接口。
  • util:工具包,例如返回的格式同一类、错误码类等。
  • mybatis ->mapper:对数据库操作的xml文件,一个mapper对应一个xml

现在准备工作都已经全部完成了,我们正式开始写代码

PS:我会在写完每个代码下面加上代码解释,好我们现在正式开始敲代码

第一步:在config包下创建MybatisPlusConfig类并写上以下代码

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

这段代码是一个Java配置类,用于配置MyBatis Plus插件。具体来说,它做了以下几件事情:

  1. 标注为@Configuration,表示它是一个配置类;
  2. 定义了一个名为mybatisPlusInterceptorBean,通过@Bean注解标注;
  3. mybatisPlusInterceptor的初始化方法中,创建了一个MybatisPlusInterceptor对象;
  4. MybatisPlusInterceptor对象中,添加了一个PaginationInnerInterceptor对象;
  5. 通过return语句,返回创建的MybatisPlusInterceptor对象。

总的来说,这段代码的作用是为MyBatis Plus插件创建一个MybatisPlusInterceptor代理对象,
并添加了分页插件(PaginationInnerInterceptor)到该代理对象中。这样,在应用中,
只需要将MybatisPlusInterceptor对象注入到需要的地方,就可以轻松地启用MyBatis Plus插件的分页功能。

同样在config包下创建PagePara类并写上以下代码,下面代码我就不做解释了,我添加了注释

@Data
public class PagePara {
    @JsonProperty("当前页数,即需要查询的页码")
    private Long nowPage;

    @JsonProperty("每页数据条数")
    private Long onePageCount;

    @JsonProperty("数据总条数")
    private Long dataCount;

    @JsonProperty("总页数,即数据总条数除以每页数据条数的结果")
    private Long pageCount;

    @JsonProperty("分页查询时需要从哪一条数据开始查询")
    private Long startIndex;

    @JsonProperty("排序字段和排序方式")
    private String orderBy;

    public PagePara() {

    }
    public PagePara(long nowPage, long onePageCount, long dataCount, long pageCount) {
        this.nowPage = nowPage;
        this.onePageCount = onePageCount;
        this.dataCount = dataCount;
        this.pageCount = pageCount;
    }
}

util包下创建PageResultS类并写上以下代码

@Data
public class PageResultS<T> {

    @JsonProperty("存储查询出来的数据")
    private List<T> list;

    @JsonProperty("分页信息数据")
    private PagePara page;
}

第二步:在entity包下创建User实体类并写上以下代码

@Data
@TableName("user")
public class User{

    /**
     * 主键id
     */
    private Integer id;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 密码
     */
    private String passWord;
}

第三步:mapper层创建UserMapper接口并写上以下代码

@Mapper
public interface UserMapper extends BaseMapper<User> {
    /**
     * 查询全部用户信息
     * @return
     */
    IPage<User> findAll(Page<PagePara> page, @Param("par")PagePara pagePara);
}

然后在resources文件下的mapper文件下创建UserMapper.xml文件写上下面代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="findAll" resultType="com.example.demo.entity.User">
        select * from user
    </select>
</mapper>

最后一步:在service包下创建UserService接口,写上方法

public interface UserService {
    PageResultS<User> userData(PagePara pagePara);
}

然后再在service包下创建impl包并且在包里面创建UserServicelmpl类来实现UserService接口,并且写上查询逻辑

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public PageResultS<User> userData(PagePara pagePara) {
        Page<PagePara> page = new Page<>(pagePara.getNowPage() == null ? 1 : pagePara.getNowPage(), pagePara.getOnePageCount() == null ? 3 : pagePara.getOnePageCount());
        IPage<User> queryResult = userMapper.findAll(page,pagePara);
        PagePara pageResult = new PagePara(queryResult.getCurrent(), queryResult.getSize(), queryResult.getTotal(), queryResult.getPages());
        PageResultS<User> result = new PageResultS<>();
        result.setList(queryResult.getRecords());
        result.setPage(pageResult);
        return result;
    }
}

这段代码定义了一个名为UserServiceImpl的类,实现了UserService接口,并提供了一个userData方法,用于查询用户数据,并返回分页结果。具体来说,这段代码的作用如下:

  1. 根据@Service注解,将当前类标记为一个Spring Service,表示它是一个商业逻辑组件。
  2. 根据@Autowired注解,注入了一个名为userMapperUserMapper对象,用于查询数据库中的用户数据。
  3. 实现了UserService接口中的userData方法,该方法接收一个PagePara对象作为参数,用于指定当前页码和每页数据条数。
  4. 在方法体中,使用PageIPage类型的对象来封装分页信息和查询结果,其中Page<PagePara>表示一个分页器,用于将查询结果分页返回;IPage<User>是一个实现了分页查询的接口对象,用于查询数据库中的用户数据,并返回分页结果。需要注意的是,findAll方法是在UserMapper接口中定义的,用于查询用户数据。
  5. 根据查询结果,将查询结果和分页信息封装到PageResultS<User>类型的对象中,并返回该对象作为查询结果。

综合来说,这段代码的作用就是实现了一个基于MyBatis PlusSpring框架的分页查询实现,其中查询逻辑由UserMapper实现,分页逻辑由Page<PagePara>类实现。这种实现方式可以方便地进行数据查询和分页,并且代码清晰易懂。
以上分页查询的代码已经全部完成了,下面我们来测试一下

接下来我们在单元测试里面写上一下代码
在这里插入图片描述
在这个DemoApplicationTests类中写上一下代码并且启动看结果

@SpringBootTest
class DemoApplicationTests {
   @Autowired
   UserService userService;
   @Test
   void contextLoads() {
        PagePara pagePara = new PagePara();
        PageResultS<User> userPageResultS = userService.userData(pagePara);
        List<User> list = userPageResultS.getList();
        System.out.println("查询数据:" + list);
        System.out.println("查询总数:" +list.size());
    }
}

在这里插入图片描述
我们换成当前页数为第二页查询看下结果

@SpringBootTest
class DemoApplicationTests {
   @Autowired
   UserService userService;
   @Test
   void contextLoads() {
        PagePara pagePara = new PagePara();
        pagePara.setNowPage(2L);
        PageResultS<User> userPageResultS = userService.userData(pagePara);
        List<User> list = userPageResultS.getList();
        System.out.println("查询数据:" + list);
        System.out.println("查询总数:" +list.size());
    }
}

在这里插入图片描述
这个时候你发现了吧,数据变了,而且只有10条数据,我们一共是有20条数据的

这个功能到此就全部完成了,如果有什么错误,就先谢谢各位大佬指教

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值