MyBatis使用PageHelper分页插件

1、不使用PageHelper分页插件

模块名:mybatis-012-page

CarMapper接口


package org.example.mapper;

import org.apache.ibatis.annotations.Param;
import org.example.pojo.Car;

import java.util.List;

public interface CarMapper {
    /**
     * 分页查询
     * @param startIndex 起始下标
     * @param pageSize 每页显示的记录条数
     * @return
     */
    List<Car> selectByPage(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);
}
CarMapper.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--要想使用接口代理机制:sql映射文件中mapper标签的namespace必须是Mapper接口的全限定名,sql语句的id值也必须是dao接口的方法名-->
<mapper namespace="org.example.mapper.CarMapper">
    <select id="selectByPage" resultType="Car">
        select * from t_car limit #{startIndex},#{pageSize}
    </select>
</mapper>
PageTest.java



import org.apache.ibatis.session.SqlSession;
import org.example.mapper.CarMapper;
import org.example.pojo.Car;
import org.example.utils.SqlSessionUtil;
import org.junit.Test;

import java.util.List;

public class TestCarMapper {
    @Test
    public void testSelectByPage(){
        //获取每页显示的记录条数
        int pageSize = 3;
        //显示第几页
        int pageNum = 2;
        //计算开始下标
        int startIndex = (pageNum - 1) * pageSize;
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectByPage(startIndex,pageSize);
        cars.forEach(car -> System.out.println(car));
        sqlSession.close();
    }
}

2、使用Mybatis的PageHelper分页插件

使用pageHelper插件分页查询后,select语句中的limit子句 Mybatis会帮我们自动生成。

2.1 导入分页插件jar包

方式一:导入jar包

方式二:引入maven依赖

<!-- PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>

2.2 在MyBatis核心配置文件中配置分页插件

2.2.1 配置 分页拦截器插件

在typeAliases标签下面同级进行配置:

    <!-- 分页拦截器插件 -->
    <plugins>
        <!--
        interceptor属性:配置PageHelper插件中的核心拦截器类。

        PageInterceptor分页拦截器类:(类似JavaWeb阶段的过滤器)
        拦截 SELECT 语句,在执行查询SQL语句 之前,
        将编写的SQL语句加上分页查询语句。
        -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 开启合理化分页-->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>

2.2.2 配置插件属性

2.3 在程序中的使用

2.3.1 实体类

package org.example.utils;

public class Emp {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Double sal;
    private Double comm;
    private Integer deptno;

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Integer getMgr() {
        return mgr;
    }

    public void setMgr(Integer mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    public Double getComm() {
        return comm;
    }

    public void setComm(Double comm) {
        this.comm = comm;
    }

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    @Override
    public String toString() {
        return "Emp{" + "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", mgr=" + mgr +
                ", hiredate=" + hiredate +
                ", sal=" + sal +
                ", comm=" + comm +
                ", deptno=" + deptno +
                '}';
    }
}

2.3.2 mapper接口

    /*
        Mapper层:分页查询的方法,不需要定义分页查询的参数和sql,
        因为分页插件会自动添加分页sql和参数
     */
public interface EmpMapper {
    List<Emp> selectByPage();
}

2.3.3 mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gs.mapper.EmpMapper">
    <!-- 使用PageHelper插件实现分页,SQL语句无需编写任何和分页相关的内容 -->
    <select id="selectByPage" resultType="com.gs.entity.Emp">
        select empno,
               ename,
               job,
               mgr,
               hiredate,
               sal,
               comm,
               deptno
        from emp
        order by empno
    </select>
</mapper>

2.2.4 测试

关键点:

  • 在DQL查询语句之前,开启分页功能,并设置基本的分页参数。

  • 调用要分页查询的方法,会返回一个封装了分页查询结果集的实体类List集合。

  • 在查询语句之后,创建分页信息对象PageInfo,它封装了 分页查询的信息。(PageInfo对象将来会存储到request域当中。在页面上展示。

    • pageInfo对象是PageHelper插件提供的

public class PageHelperTest {
    @Test
    public void testPageHelper() {
        SqlSession sqlSession = MybatisUtil.getSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        //在执行DQL语句之前开启分页功能:
        //PageHelper.startPage(pageNum,pageSize);传入页码和每页的记录条数进行分页
        PageHelper.startPage(1, 5);
        List<Emp> empList = empMapper.selectByPage();
        for (Emp emp : empList) {
            System.out.println(emp);
        }
        //创建分页信息对象
        PageInfo<Emp> pageInfo = new PageInfo<>(empList);
        System.out.println("当前页数:" + pageInfo.getPageNum());
        System.out.println("每页条数:" + pageInfo.getPageSize());
        System.out.println("总记录数:" + pageInfo.getTotal());
        System.out.println("总页数:" + pageInfo.getPages());
        System.out.println("上一页:" + pageInfo.getPrePage());
        System.out.println("下一页:" + pageInfo.getNextPage());
        System.out.println("是否有上一页:" + pageInfo.isHasPreviousPage());
        System.out.println("是否有下一页:" + pageInfo.isHasNextPage());
        System.out.println("是否为首页:" + pageInfo.isIsFirstPage());
        System.out.println("是否为末页:" + pageInfo.isIsLastPage());
        System.out.println("存放页码的数据:" +
                Arrays.toString(pageInfo.getNavigatepageNums()));
        System.out.println("获取当前页数据:" + pageInfo.getList());
        sqlSession.close();
    }
}

2.4 PageHelper的Page类

这个类是一个ArrayList集合:

public class Page<E> extends ArrayList<E> implements Closeable

直接看例子:

mapper映射文件中的分页查询语句: 

    <select id="pageQuery" resultType="com.sky.entity.Employee" parameterType="com.sky.dto.EmployeePageQueryDTO">
        select *
        from employee
        <where>
            <if test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </if>
        </where>
        order by create_time desc
    </select>

Mapper接口中的分页查询方法:

    /**
     * 分页查询
     * @param employeePageQueryDTO
     * @return
     */
    Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);

ServiceImpl实现类中的分页查询方法:

  • 从这里可以分析出,
    • 因为Page类是一个ArrayList集合,所以可以用其来接收分页查询结果集。
    • mapper映射文件中的resultType指定为什么类型,Page对象就是什么类型的ArrayList集合。
    • 从Page对象中调用getTotal方法获取分页查询的总记录数。
    • 从Page对象中调用getResult方法获取封装了分页查询结果集的List集合对象。
    /**
     * 分页查询
     * @param employeePageQueryDTO
     * @return
     */
    @Override
    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
        //开始分页查询
        PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
        //执行分页查询
        Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);
        //获取分页查询结果信息
        long total = page.getTotal();
        List<Employee> records = page.getResult();

        return new PageResult(total,records);
    }

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis 是一个优秀的持久层框架,而 PageHelper 是一个用于 MyBatis分页插件使用 PageHelper 可以方便地实现分页功能。下面是使用 PageHelper 进行分页的步骤: 1. 添加依赖:在项目的 `pom.xml` 文件添加以下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>latest-version</version> </dependency> ``` 可以在 Maven 仓库找到最新版本的 PageHelper。 2. 配置 PageHelper:在 MyBatis 的配置文件添加以下配置项: ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 可选:设置数据库方言,用于支持不同数据库的分页 --> <property name="dialect" value="mysql"/> <!-- 可选:设置为 true 启用合理化查询,开启后,如果 pageSize=0 或者 PageMethod 的 `count` 参数为 true,则会查询总数 --> <property name="reasonable" value="true"/> </plugin> </plugins> ``` 注意:根据你所使用的数据库类型,需要将 `dialect` 属性配置为相应的数据库方言。 3. 使用 PageHelper 进行分页:在需要进行分页的查询方法使用 PageHelper 的静态方法来设置分页参数,例如: ```java import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; // ... // 设置分页参数,pageNum 表示当前页数,pageSize 表示每页显示的记录数 PageHelper.startPage(pageNum, pageSize); // 执行查询 List<MyEntity> resultList = myEntityMapper.selectByExample(example); // 封装查询结果,并返回给前端 PageInfo<MyEntity> pageInfo = new PageInfo<>(resultList); return pageInfo; ``` 这样就完成了使用 PageHelper 进行分页的配置和使用PageHelper 会自动在查询语句后面添加分页的 SQL 语句,根据传入的分页参数进行数据查询和结果封装。返回的 `PageInfo` 对象可以用于获取分页相关的信息,如总记录数、总页数等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值