Mybatis使用pagehelper分页插件实现分页

在使用pagehelper插件,核心就是利用sql语句中的limit对数据进行范围的查找显示,下面我们来看如何实现插件,我们通过一个小demo来看一下原理

应用的场景:

查询一个部门下员工的所有信息,利用分页显示,一页4条记录,并且显示当前页的记录时,要显示总记录数,总页数,当前页。

1.导入项目依赖

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

如果不是maven项目,则导入这两个jar包,下载的地址为:https://mvnrepository.com/

jsqlparser-3.1.jar
pagehelper-5.1.10.jar

2.配置拦截器,注意plugins在typeAliases的后面,源码中说的很清楚了

<plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--&lt;!&ndash; config params as the following &ndash;&gt;-->
            <!--<property name="dialect" value="mysql"/>-->
            <property name="reasonable" value="true"/>
            <!--<property name="dialect" value="mysql"/>-->
        </plugin>
    </plugins>

如果有对源码不太清楚的小伙伴可以看一下:

Mybatis的源码解析(一):SqlSessionFactory
Mybatis的源码解析(二):SqlSession
Mybatis的源码解析(三):获得xxxMapper对象并执行

3.数据库的表及javaBean

在这里插入图片描述
在这里插入图片描述

  • EmpInfo
package com.itt.entity;

import java.util.List;

public class EmpInfo extends Department{

    private String id;
    private String name;
    private String age;
    private String job;
    private String phone;
    private String did;

    List<EmpInfo> empInfos;

    public List<EmpInfo> getEmpInfos() {
        return empInfos;
    }

    public void setEmpInfos(List<EmpInfo> empInfos) {
        this.empInfos = empInfos;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getJob() {
        return job;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getDid() {
        return did;
    }

    public void setDid(String did) {
        this.did = did;
    }

    @Override
    public String toString() {
        return "id:"+this.id+","+"name:"+this.name+","+"age:"+this.age+","+
                "job:"+this.job+","+"phone:"+this.phone+","+"did:"+this.did;
    }

    public EmpInfo(String id, String name, String age, String job, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.job = job;
        this.phone = phone;
    }

    public EmpInfo(String id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

    public EmpInfo() {

    }
}

  • Department
package com.itt.entity;


public class Department{

    private String did;
    private String dname;


    public Department() {
    }

    public Department(String did, String dname) {
        this.did = did;
        this.dname = dname;
    }

    public String getDid() {
        return did;
    }

    public void setDid(String did) {
        this.did = did;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Department{" +
                "did='" + did + '\'' +
                ", dname='" + dname + '\'' +
                '}';
    }
}

4.主配置文件conf.xml

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

    <properties resource="db.properties"/>
    <!--全局参数-->
    <settings>
        <!--开启日志-->
        <setting name="logImpl" value="LOG4J"/>
        <setting name="cacheEnabled" value="false"/>
        <!--<setting name="jdbcTypeForNull" value="NUll"/>-->
    </settings>


    <!--设置单个/多个别名-->
    <typeAliases>
        <!--单个别名(别名 忽略大小写)-->
        <!--<typeAlias type="com.itt.entity.EmpInfo" alias="student"/>-->
        <!--批量定义别名,以下会自动将该包中的所有类 批量定义别名:别名就是类名(不带包名的类名)-->
        <package name="com.itt.entity"/>
    </typeAliases>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--&lt;!&ndash; config params as the following &ndash;&gt;-->
            <!--<property name="dialect" value="mysql"/>-->
            <property name="reasonable" value="true"/>
            <!--<property name="dialect" value="mysql"/>-->
        </plugin>
    </plugins>

    <!--<typeHandlers>-->
        <!--<typeHandler handler="com.itt.converter.BooleanAndIntConverter"-->
                     <!--javaType="boolean" jdbcType="INTEGER"/>-->
    <!--</typeHandlers>-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置数据库的支持类-->
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
    </databaseIdProvider>

    <mappers>
        <package name="com.itt.mapper"/>
    </mappers>
</configuration>

5.接口

 String queryBy(String dname);

 List<EmpInfo> queryBydname(String did);

6.EmpInfoMapper.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">

<mapper namespace="com.itt.mapper.EmpInfoMapper">
	<select id="queryBydname" parameterType="String" resultMap="ByDid">
        SELECT e.*  FROM empinfo e INNER JOIN department d
	    ON d.did = e.did WHERE d.did = #{did} order by id desc
    </select>
    <resultMap id="ByDid" type="EmpInfo">
        <id  property="id" column="id" />
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="job" column="job"/>
        <result property="phone" column="phone"/>
        <result property="did" column="did"/>
    </resultMap>
</mapper>

7.测试

    @Test
    public  void queryBydname() throws Exception{
        //Connection - SqlSession操作myBatis

        //config.xml  -> reader
        Reader reader = Resources.getResourceAsReader("conf.xml");

        //reader  ->SqlSession
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sessionFactory.openSession();


        EmpInfoMapper mapper = session.getMapper(EmpInfoMapper.class);


        String query = mapper.queryBy("技术部");
        //显示第一页,并且一页显示4条数据
        Page<Object> page = PageHelper.startPage(1, 4);
        List<EmpInfo> list = mapper.queryBydname(query);
        
        for (EmpInfo empInfo : list) {
            System.out.println(empInfo);
        }

        //打印分页信息
        System.out.println("当前页:" + page.getPageNum());
        System.out.println("总数据:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());


        session.close();
    }
  • 原先表中的数据
    在这里插入图片描述
    运行之后的结果:
    在这里插入图片描述

总结: 这里我们要注意的是在写:

Page page = PageHelper.startPage(1, 4);时,要注意位置,我就是在这里出现 了问题,一直不能分页,主要是要细心!共勉!

发布了47 篇原创文章 · 获赞 34 · 访问量 8868

猜你喜欢

转载自blog.csdn.net/weixin_42893085/article/details/105210964