Java中如何实现分页功能
本文小编为大家详细介绍"Java中如何实现分页功能",内容详细,步骤清晰,细节处理妥当,希望这篇"Java中如何实现分页功能"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、limit关键字
通过使用这个方法我们来看下相关的service层的代码:
@Service@Transactionalpublic class ImplStudentService implements StudentService {@Resourceprivate StudentDao studentDao; @Override public ListselectAllStudent(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); }
跟 limit 关键字方法不同的是,在 hibernate 方法中使用的是 dao层,代码如下所示:
@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); }
三、截取List查询结果分页
对于这个方法会显得比较的简单我们直接来看代码:
@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); }
四、mybatis框架pageHelper插件分页
首先我们来看 Spring整合部分:
导入pom.xml 代码如下所示:
@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); }
我们通过配置项目的配置文件代码如下所示:
classpath*:com/yyz/mapper/*Mapper.xml helperDialect=mysql reasonable=true params=count=countSql supportMethodsArguments=true autoRuntimeDialect=true
SpringBoot整合:
@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); }
配置项目 application.xml
文件,代码如下所示:
@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); }
对于在分页插件中为我们也提供了下面这些参数:
dialect:
默认情况下会使用PageHelper
方式进行分页,如果想要实现自己的分页逻辑,可以实现 。Dialect
(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。 使用自定义dialect
实现时,下面的参数没有任何作用。helperDialect
:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式oracle
,mysql
,mariadb
,sqlite
,hsqldb
,postgresql
,db2
,sqlserver
,informix
,h3
,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
的问题 RowBound
在查询的时候 reasonable
会强制为 false
,但是使用PageHelper.startPage
方法不受影响。我们来看下相关内容的 service层的代码:
@Overridepublic ResponseResult selectAllStudent(Integer pageNum, Integer pageSize) { Mapmap = new HashMap<>(); PageHelper.startPage(pageNum,pageSize); List 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 items = null;try { items = travelRepository.getTravelItemsByTravelDateBetweenAndUserId(theStartDate, theEndDate, openId, pageable);} catch (Exception e) { throw new DatabaseRelatedException("TravelRepository异常");}
这就是有关于在service层的代码,那么对于dao层的话,接口继承的是PagingAndSortingRepository
接口,所以我们注意要加@Repository
注解。
读到这里,这篇"Java中如何实现分页功能"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。