在SSM整合框架中使用PageHelper分页插件

        PageHelper是一款开源的MyBatis插件,它提供了对MySQL、Oracle、DB2等主流数据库的支持,极大地简化了后端处理分页查询的过程,使用PageHelper对后端开发有很大帮助。

1. 引入PageHelper的依赖jar包

  • PageHelper 的下载地址: pagehelper-xyz.jar
  • jsqlparser 的下载地址:jsqlparser-xyz.jar

2. 配置PageHelper

在 Spring 核心配置文件 application.xml 中,配置 org.mybatis.spring.SqlSessionFactoryBean 时添加属性:

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        
        <property name="dataSource" ref="dataSource"/>
        
        <property name="plugins">
            <array>
                
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            
                            <prop key="helperDialect">oracleprop>
                            
                            <prop key="reasonable">trueprop>
                        props>
                    property>
                bean>
            array>
        property>
    bean>

3. PageHelper 常用类信息

在使用 PageHelper 时,有3个主要使用的类需要了解:
在SSM整合框架中使用PageHelper分页插件_第1张图片

  • Page 分页对象

    继承 ArrayList,对查询结果进行进一步的封装处理

    主要属性:

            pageNum : 起始页码

            pageSize : 每页显示条数

            startRow : 起始行

            endRow : 结束行

            total : 总记录数

            pages : 总页数

            reasonable : 分页合理化,布尔值,是否对超出范围的页码自动优化处理

  • PageHelper 通用分页拦截器

    拦截查询方法,对其进行分页相关的增强

    常用方法:

            Page < E > startPage(int pageNum,int pageSize):根据起始页和每页条数查询,返回一个Page结果集

            Page < E > offsetPage(int offset,int limit):根据起始索引和查询条数查询,返回一个Page结果集

  • PageInfo 响应给前端的分页对象

    对Page结果进行包装

    主要属性:

            pageNum : 当前页

            pageSize : 每页的数量

            size : 当前页的数量(最后一页不足每页条数)

            startRow : 当前页面第一个元素在数据库中的行号

            endRow : 当前页面最后一个元素在数据库中的行号

            pages : 总页数

            prePage: 上一页的页码

            nextPage: 下一页的页码

    构造方法:

             public PageInfo(List list) {
                     this(list, 8);
             }

4. PageHelper 使用步骤

在调用dao层方法前,先执行startPage()或offsetPage()方法

@Service("odersService")
public class OrdersServiceImpl implements IOrdersService {
    @Autowired
    private IOrdersDao iOrdersDao;

    @Override
    public List<Orders> findAll(int page, int size) {
    	//开启分页插件拦截器
        PageHelper.startPage(page, size);
        return iOrdersDao.findAll();
    }
}

将返回的分页信息通过 PageInfo 的构造方法进行封装(Page是ArrayList的子类)

@Controller
@RequestMapping("/orders")
public class OrdersController {

    @Autowired
    private IOrdersService odersService;

    @RequestMapping("/findAll.do")
    public ModelAndView findAll(@RequestParam(name = "pageNum", defaultValue = "1") int page, @RequestParam(name = "pageSize", defaultValue = "4") int size) {
        ModelAndView mv = new ModelAndView();
        List<Orders> odersList = odersService.findAll(page, size);
        //封装结果集
        PageInfo pageInfo = new PageInfo(odersList);
        mv.addObject("pageInfo", pageInfo);
        mv.setViewName("orders-list");
        return mv;
    }

}

只需要查询最简单的 “select * from orders” 语句,PageHelper将会自动调用count()方法,获取总记录数,计算出总页数等,并对结果集进行封装

5. PageHelper 使用的注意点

1. 只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页。

2. 不能同时配置多个分页插件

3. 分页插件不支持带有 for update 语句的分页,需要手动分页

4. 不支持一对一和一对多结果映射的分页查询,如果分页显示20条数据,这20条数据中每一个包含30条子数据,则子数据只能显示20条,其余会丢失。

你可能感兴趣的:(框架)