Java实现分页的几种方法详细解析

 更新时间:2023年11月10日 09:42:29   作者:老周聊架构  
这篇文章主要介绍了Java实现分页的几种方法详细解析,在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);
}

五、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注解

到此这篇关于Java实现分页的几种方法详细解析的文章就介绍到这了,更多相关Java分页的方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之java泛型通配符详解

    Java基础之java泛型通配符详解

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型,今天通过本文给大家介绍java泛型通配符的相关知识,感兴趣的朋友一起看看吧
    2021-07-07
  • jsp+servlet实现简单登录页面功能(附demo)

    jsp+servlet实现简单登录页面功能(附demo)

    本文主要介绍了jsp+servlet实现简单登录页面功能登录成功跳转新页面,登录失败在原登录界面提示登录失败信息,对初学者有一定的帮助,感兴趣的可以了解一下
    2021-07-07
  • Java使用Hutool执行日期的加法和减法操作方法

    Java使用Hutool执行日期的加法和减法操作方法

    使用Hutool进行日期的加法和减法操作,可以使用`DateUtil.offsetXXX()`方法来实现,这些方法会返回一个新的日期,而不是在原日期上进行修改,本文给大家介绍Java使用Hutool执行日期的加法和减法操作方法,感兴趣的朋友一起看看吧
    2023-11-11
  • Java hashCode() 方法详细解读

    Java hashCode() 方法详细解读

    Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色,本文对hashCode()方法深入理解,希望能帮助大家
    2016-07-07
  • Java中Semaphore(信号量)的使用方法

    Java中Semaphore(信号量)的使用方法

    这篇文章主要介绍了Java中Semaphore(信号量)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java8与Scala中的Lambda表达式深入讲解

    Java8与Scala中的Lambda表达式深入讲解

    这篇文章主要给大家介绍了关于Java8与Scala中Lambda表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java集合框架入门之泛型和包装类

    Java集合框架入门之泛型和包装类

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
    2021-10-10
  • springMVC4之强大类型转换器实例解析

    springMVC4之强大类型转换器实例解析

    本篇文章主要介绍了springMVC4之强大类型转换器实例解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java的三种代理模式简述

    Java的三种代理模式简述

    这篇文章主要简述Java的三种代理模式,java的代理模式主要包括静态代理、动态代理、Cglib代理,感兴趣的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • ThreadPoolExecutor线程池原理及其execute方法(详解)

    ThreadPoolExecutor线程池原理及其execute方法(详解)

    下面小编就为大家带来一篇ThreadPoolExecutor线程池原理及其execute方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论