Java实现分页功能常见的几种方法 java分页操作
wptr33 2024-12-15 17:12 23 浏览
欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。
一、limit关键字
service层
@Service
@Transactional
public class ImplStudentService implements StudentService {
@Resource
private StudentDao studentDao;
@Override
public List<Student> selectAllStudent(String province, Integer offset, Integer limit) {
return studentDao.selectAll(province,offset,limit);
}
}
sql语句
select * from student where province = #{province} limit #{offset},#{limit}
二、hibernate分页
service层
@Override
public List getStudents(Integer pageNo,Integer pageSize) throws Exception {
// 分页数据
int[] startIdAndCount = new int[2];
startIdAndCount[0] = pageNo * pageSize;
startIdAndCount[1] = pageSize;
return studentDao.selectStudentsByPage(startIdAndCount);
}
dao层
@Override
public List findByHqlPage(int[] startIdAndCount) throws Exception {
String hql = "...";
try {
Query query = getSession().createQuery(hql);
// 设置分页
if (startIdAndCount != null && startIdAndCount.length > 0) {
int rowStartIdx = Math.max(0, startIdAndCount[0]);
if (rowStartIdx > 0) {
query.setFirstResult(rowStartIdx);// 设置开始取值的索引
}
if (startIdAndCount.length > 1) {
int rowCount = Math.max(0, startIdAndCount[1]);
if (rowCount > 0) {
query.setMaxResults(rowCount);// 设置结束取值的索引
}
}
}
return query.list();
} catch (RuntimeException re) {
log.error("分页查询失败!", re);
throw re;
}
}
三、截取List查询结果分页(简单粗暴)
...
List<StudentEnroll> students = studentlDao.getAllStudents();
int count = 0;
if(studentEnrolls != null && studentEnrolls.size() > 0) {
count = studentEnrolls.size();
int fromIndex = pageNo * pageSize;
int toIndex = (pageNo + 1) * pageSize;
if(toIndex > count) {
toIndex = count;
}
List<StudentEnroll> pageList = studentEnrolls.subList(fromIndex, toIndex);
...
四、mybatis框架pageHelper插件分页
Spring整合:
导入pom.xml
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
配置项目配置文件(我在spring和mybatis整合的配置文件中配置的,如果在mybatis核心配置文件中配置,百度一下)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 依赖数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 注册加载myBatis映射文件 -->
<property name="mapperLocations">
<array>
<value>classpath*:com/yyz/mapper/*Mapper.xml</value>
</array>
</property>
<!-- PageHelper分页配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个,后面会有所有的参数介绍 -->
<value>
<!--helperDialect属性来指定分页插件使用哪种方言。-->
helperDialect=mysql
<!--分页合理化参数,设置为true时,pageNum<=0时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。-->
reasonable=true
<!--为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,
可以配置 pageNum,pageSize,count,pageSizeZero,reasonable-->
params=count=countSql
<!--支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配
置的字段中取值,查找到合适的值时就会自动分页。-->
supportMethodsArguments=true
<!--默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页-->
autoRuntimeDialect=true
</value>
</property>
</bean>
</array>
</property>
<!-- 给数据库实体起别名 -->
<property name="typeAliasesPackage" value="com.yyz.entity;"/>
</bean>
SpringBoot整合:
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
配置项目application.yml文件
#bybatis分页插件配置
pagehelper:
helper-dialect: mysql #数据库
reasonable: true
support-methods-arguments: true
params: count=countSql
## 标题分页插件参数:
分页插件提供了多个可选参数,这些参数使用时,按照上面配置方式中的示例配置即可。
分页插件可选参数如下:
dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现
Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。 使用自定义
dialect 实现时,下面的参数没有任何作用。helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005
的方式进行分页。offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true
时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。
当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者
RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,
可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。supportMethodsArguments:支持通过 Mapper
接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params
配置的字段中取值,查找到合适的值时就会自动分页。aggregateFunctions:默认为所有常见数据库的聚合函数,允许手动添加聚合函数(影响行数),所有以聚合函数开头的函数,在进行
count 转换时,会套一层。其他函数和列会被替换为 count(0),其中count列可以自己配置。
重要提示:
当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。
service层
@Override
public ResponseResult selectAllStudent(Integer pageNum, Integer pageSize) {
Map<String,Object> map = new HashMap<>();
PageHelper.startPage(pageNum,pageSize);
List<Student> students = studentMapper.selectAllStudents();
PageInfo pageInfo = new PageInfo(students);
long total = pageInfo.getTotal();
map.put("result",pageInfo);
map.put("count",total);
return ResponseResultUtil.success(map);
}
详细请看 SpringBoot集成MyBatis的分页插件PageHelper
五、springData分页
service层
...
Sort.Order travelDate = new Sort.Order(Sort.Direction.DESC, "travelDate");
Sort.Order createdTime = new Sort.Order(Sort.Direction.DESC, "createdTime");
Sort sort = new Sort(travelDate, createdTime);
Pageable pageable = new PageRequest(page, pageSize, sort);
List<TravelItem> items = null;
try {
items = travelRepository.getTravelItemsByTravelDateBetweenAndUserId(theStartDate, theEndDate, openId, pageable);
} catch (Exception e) {
throw new DatabaseRelatedException("TravelRepository异常");
}
...
dao层:接口继承的是PagingAndSortingRepository接口,注意要加@Repository注解
相关推荐
- Linux文件系统操作常用命令(linux文件内容操作命令)
-
在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...
- 别小看tail 命令,它难倒了技术总监
-
我把自己以往的文章汇总成为了Github,欢迎各位大佬star...
- lnav:基于 Linux 的高级控制台日志文件查看器
-
lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...
- 声明式与命令式代码(声明模式和命令模式)
-
编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...
- linux中的常用命令(linux常用命令和作用)
-
linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...
- 如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)
-
这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...
- 最通俗易懂的命令模式讲解(命令模式百科)
-
我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...
- 互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?
-
你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...
- Linux 常用命令(linux常用的20个命令面试)
-
日志排查类操作命令...
- Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)
-
if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...
- 外贸干货|如何增加领英的曝光量和询盘
-
#跨境电商#...
- golang执行linux命令(golang调用shell脚本)
-
需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...
- LINUX磁盘挂载(linux磁盘挂载到windows)
-
1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...
- Linux命令学习——nl命令(linux ln命令的使用)
-
nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)