【MyBatis框架】MyBatis实现物理分页和逻辑(内存)分页

实现查询分页有两种思路,一种是在SQL语句中直接完成分页,查询出来后直接使用,例如在SQL语句中使用LIMIT关键字;另外一种是SQL语句只做查询,其他诸如分页、数值处理的操作都由编程语言来完成,在MyBatis中就采用了这种方法。

下面来介绍两种MyBatis中支持的分页方法:

方式1:使用RowBounds对象实现逻辑分页

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。

使用方式就是在调取sql语句的时候,加上RowBounds对象来指定分页开始的位置和要显示的条数。

//调取sql语句,selectList("方法的完整路径"),路径=namespace+id
List<Student> list = session.selectList("com.maven.dao.StudentDao.getall",null,new RowBounds(0,3));// rowBounds(开始位置,显示条数)

方式2:使用.pageHelper分页插件

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

步骤一:导入jar包

分页插件:pagehelper.jar

sql 解析工具:jsqlparser.jar

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.6</version>
</dependency>

步骤二、在mybatis.xml配置文件中配置插件

插件5.1之前:

<plugins>
    <!-- PageHelper4.1.6 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
    </plugin>
</plugins>

插件5.1之后:interceptor不同,并且不需要指定数据库名字

<plugins>
	<plugin interceptor="com.github.pagehelper.PageInterceptor">
    </plugin>
</plugins>

步骤三、在执行查询之前指定分页的参数

PageHelper.startPage(当前页,每页条数)

还可以将返回的list结果封装在PageInfo对象里,通过使用该对象实现对总条数、总页数、上一页、下一页、当前页、每页显示条数、当前页显示条数的查询,详见下文。

例如

//1.加载配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//2.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder();
//3.得到session工厂
SqlSessionFactory factory = builder.build(reader,"development2");
//4.得到SqlSession对象
SqlSession session = factory.openSession();
//5.调取sql语句,selectList("方法的完整路径"),路径=namespace+id
//5.1 指定分页的参数
PageHelper.startPage(2,3);
//5.2 调取Dao层方法
List<Student> list = session.selectList("com.maven.dao.StudentDao.getall");
//5.3 创建分页工具类对象
PageInfo<Student> info = new PageInfo<>(list);
//6.遍历
for (Student student:info.getList()) {
    System.out.println(student);
}
System.out.println("总条数:"+info.getTotal());
System.out.println("总页数:"+info.getPages());
System.out.println("上一页:"+info.getPrePage());
//如果没有下一页, 则返回0
System.out.println("下一页:"+info.getNextPage());
System.out.println("当前页:"+info.getPageNum());
System.out.println("每页显示条数:"+info.getPageSize());
System.out.println("当前页的条数:"+info.getSize());
//7.关闭数据源
session.close();
reader.close();

逻辑分页和物理分页相比的优缺点

  • 物理分页每次都要访问数据库,逻辑分页只访问一次

  • 物理分页占用内存少,逻辑分页相对较多

  • 物理分页数据每次都是最新的,逻辑分页有可能滞后


下篇介绍一下缓存

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页