在Java中怎么实现分页功能?实现分页功能常见的方法!

2021-07-07 16:11:10 浏览数 (62)

相比有接触过或者对编程有自己了解的人来说对 java 并不会很陌生,那么就拿 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);
 }

跟 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);
 }

我们通过配置项目的配置文件代码如下所示:

<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整合:

  @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​,​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 ​的问题 ​RowBound ​在查询的时候 ​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异常");

}

这就是有关于在service层的代码,那么对于dao层的话,接口继承的是​PagingAndSortingRepository​接口,所以我们注意要加​@Repository​注解。


总结:

以上就是有关于在java中“怎么实现分页功能?”这个问题的相关内容当然如果你有更好的方法和见解也可以和大家一起分享,更多有关于在java这方面的相关内容我们都可以在W3Cschool中进行学习和了解。


3 人点赞