文章目录
- 基于mybatis-plus分页查询功能的实现
- 前言
- 一、建一个Spring Boot项目
- 二、导入依赖
- 三、创建数据库
- 四、连接数据库
- 五、分页效果实现
基于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开发更加便捷和高效。作用就是后面写实体类的时候我就不用再去写set
、get
等方法,加一个@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 = InnoDBCHARACTER SET = utf8mb4COLLATE = utf8mb4_binROW_FORMAT = DynamicCOMMENT '用户表';
第三步:我们执行下面我写好的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%2B8username: 自己数据库用户名password: 自己数据库密码driver-class-name: com.mysql.cj.jdbc.Drivermybatis: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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}
这段代码是一个Java
配置类,用于配置MyBatis Plus
插件。具体来说,它做了以下几件事情:
- 标注为
@Configuration
,表示它是一个配置类; - 定义了一个名为
mybatisPlusInterceptor
的Bean
,通过@Bean
注解标注; - 在
mybatisPlusInterceptor
的初始化方法中,创建了一个MybatisPlusInterceptor
对象; - 在
MybatisPlusInterceptor
对象中,添加了一个PaginationInnerInterceptor
对象; - 通过
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 mapperPUBLIC "-//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 {@Autowiredprivate UserMapper userMapper;@Overridepublic 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
方法,用于查询用户数据,并返回分页结果。具体来说,这段代码的作用如下:
- 根据
@Service
注解,将当前类标记为一个Spring Service
,表示它是一个商业逻辑组件。 - 根据
@Autowired
注解,注入了一个名为userMapper
的UserMapper
对象,用于查询数据库中的用户数据。 - 实现了
UserService
接口中的userData
方法,该方法接收一个PagePara
对象作为参数,用于指定当前页码和每页数据条数。 - 在方法体中,使用
Page
和IPage
类型的对象来封装分页信息和查询结果,其中Page<PagePara>
表示一个分页器,用于将查询结果分页返回;IPage<User>
是一个实现了分页查询的接口对象,用于查询数据库中的用户数据,并返回分页结果。需要注意的是,findAll
方法是在UserMapper
接口中定义的,用于查询用户数据。 - 根据查询结果,将查询结果和分页信息封装到
PageResultS<User>
类型的对象中,并返回该对象作为查询结果。
综合来说,这段代码的作用就是实现了一个基于MyBatis Plus
和Spring
框架的分页查询实现,其中查询逻辑由UserMapper
实现,分页逻辑由Page<PagePara>
类实现。这种实现方式可以方便地进行数据查询和分页,并且代码清晰易懂。
以上分页查询的代码已经全部完成了,下面我们来测试一下
接下来我们在单元测试里面写上一下代码
在这个DemoApplicationTests类中写上一下代码并且启动看结果
@SpringBootTest
class DemoApplicationTests {@AutowiredUserService userService;@Testvoid 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 {@AutowiredUserService userService;@Testvoid 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条数据的
这个功能到此就全部完成了,如果有什么错误,就先谢谢各位大佬指教