MyBatis——分頁插件PageHelper

1 前言

MyBatis 通過 PageHelper 可以很方便地實現分頁查詢,通過獲取 PageInfo 對象實現分頁管理。獲取 PageInfo 的方法如下:

PageHelper.startPage(pageNum, pageSize);		
List<Student> list=mapper.selectAll();
PageInfo<Student> pageInfo=new PageInfo(list);
//PageInfo<Student> pageInfo=new PageInfo(list,navigation_pages);

其中,pageNum 用於設置當前顯示的頁碼(從1開始),pageSize 用於設置頁面顯示的記錄數,navigation_pages 用於設置頁面導航界面可以顯示的頁數。

PageInfo 中常用的方法如下:

public int getPageNum() //獲取當前頁的編號(從1開始)
public int getPageSize() //獲取每頁包含的記錄數
public int getSize() //獲取當前頁包含的記錄數(最後一頁包含的記錄數可能小於前面頁)
public int getStartRow() //當前頁面第一個元素在數據庫中的行號
public int getEndRow() //當前頁面最後一個元素在數據庫中的行號
public long getTotal() //總記錄數
public int getPages() //總頁數
public int getPrePage() //前一頁
public int getNextPage() //下一頁
public boolean isIsFirstPage() //是否爲第一頁
public boolean isIsLastPage() //是否爲最後一頁
public boolean isHasPreviousPage() //是否有前一頁
public boolean isHasNextPage() //是否有下一頁
public int getNavigatePages() //導航頁碼數
public int[] getNavigatepageNums() //所有導航頁號
public int getNavigateFirstPage() //導航條上的第一頁
public int getNavigateLastPage() //導航條上的最後一頁

2 實驗環境

(1)導入 JAR 包

其中,部分 jar 包下載地址見 → jsqlparser-0.9.5.jarlog4j-1.2.17.jar、 mybatis-3.4.1.jarpagehelper-5.0.0.jar,將 jar 包放入 lib 目錄下,並選中所有 jar 包,右鍵,選擇【Add to Build Path】。 

(2)工作目錄

注意:src 和 conf 目錄下的 com.mapper 包必須同名。 

(3)配置文件

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<param name="Encoding" value="UTF-8" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L)\n" />
		</layout>
	</appender>
 
	<logger name="java.sql">
		<level value="debug" />
	</logger>
 
	<logger name="org.apache.ibatis">
		<level value="info" />
	</logger>
 
	<root>
		<priority value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

注意:log4j.xml文件名不能隨意更改。  

mybatis-config.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="jdbc.properties"></properties>
	
	<!-- 配置分頁插件 -->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
	</plugins>
	
	<!-- 設置連接數據庫的環境,default用於設置默認使用的數據庫環境 -->
	<environments default="mysql">
		<!-- 設置某個具體的數據庫環境 -->
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 引入映射文件 -->
	<mappers>
		<package name="com.mapper"/>
	</mappers>
</configuration>

注意:com.github.pagehelper.PageInterceptor 爲待配置的分頁插件。

jdbc.properties

# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users
jdbc.username=root
jdbc.password=0.

3 案例分析

首先在 MySQL 中創建數據庫:users,再在此數據庫中創建表:students。

students 包含 sid(int)、sname(varchar)和 sex(varchar) 3個字段,其中,sid 設置了自增,students 表中數據如下:

students

首先介紹下公共的文件,主要包含 Student.java、StudentMapper.java、StudentMapper.xml,不同的是 Test.java,將在各節分別介紹。  

Student.java

package com.bean;
 
public class Student {
	private Integer sid;
	private String sname;
	
	public Integer getSid() {
		return sid;
	}
 
	public void setSid(Integer sid) {
		this.sid = sid;
	}
 
	public String getSname() {
		return sname;
	}
 
	public void setSname(String sname) {
		this.sname = sname;
	}
 
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}
}

StudentMapper.java

package com.mapper;

import java.util.List;
import com.bean.Student;

public interface StudentMapper {
    List<Student> selectAll();
}

StudentMapper.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.mapper.StudentMapper" >
  <select id="selectAll" resultType="com.bean.Student" >
    select sid,sname,sex from students
  </select>
</mapper>

3.1 測試一

Test.java

package com.test;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.bean.Student;
import com.github.pagehelper.PageHelper;
import com.mapper.StudentMapper;
 
public class Test {
	
	public static void main(String[] args) throws IOException {
		InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);		
		SqlSession sqlSession=sqlSessionFactory.openSession(true); //自動提交事務
		StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);	
		
		PageHelper.startPage(3,3);
		List<Student> list=mapper.selectAll();
		System.out.println(list.getClass().getName()); //com.github.pagehelper.Page
		System.out.println(list);
		for(Student student : list) {
			System.out.println(student);
		}
	}
}

注意: PageHelper.startPage(pageNum, pageSize) 中,pageNum 用於設置當前顯示的頁碼(從1開始),pageSize 用於設置頁面顯示的記錄數。

運行結果:

DEBUG 06-20 17:23:42,350 ==>  Preparing: SELECT count(0) FROM students  
DEBUG 06-20 17:23:42,397 ==>  Preparing: select sid,sname,sex from students LIMIT 6,3  
Page{count=true, pageNum=3, pageSize=3, startRow=6, endRow=9, total=15, pages=5, reasonable=false, pageSizeZero=false}
Student [sid=1007, sname=黃七]
Student [sid=1008, sname=趙八]
Student [sid=1009, sname=吳九]

可以看到,有2條查詢語句,第一條查詢總記錄數(方便頁面管理),第二條查詢當前頁的記錄(包含 LIMIT 子句);輸出的 list 是一個 Page 類,包含 pageNum(頁編碼)、pageSize(每頁包含記錄數)、startRow(該頁第一個記錄行號)、endRow(該頁最後一個記錄行號)、total(總記錄數)、pages(總頁數) 等屬性。

3.2 測試二

Test.java

package com.test;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.bean.Student;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mapper.StudentMapper;
 
public class Test {
	
	public static void main(String[] args) throws IOException {
		InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);	
		SqlSession sqlSession=sqlSessionFactory.openSession(true); //自動提交事務
		StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);	
		
		PageHelper.startPage(3,2);
		List<Student> list=mapper.selectAll();
		PageInfo<Student> pageInfo=new PageInfo(list,5);
		System.out.println(Arrays.toString(pageInfo.getNavigatepageNums()));
		System.out.println(list);
		for(Student student : list) {
			System.out.println(student);
		}
	}
}

注意: 構造方法 PageInfo(list,navigation_pages) 中,navigation_pages 用於設置頁面導航界面可以顯示的頁數;getNavigatepageNums() 方法用於獲取導航頁碼數組,以當前頁編號爲中心,向兩邊擴展。

運行結果:

DEBUG 06-20 17:36:04,042 ==>  Preparing: SELECT count(0) FROM students  
DEBUG 06-20 17:36:04,088 ==>  Preparing: select sid,sname,sex from students LIMIT 4,2  
[1, 2, 3, 4, 5]
Page{count=true, pageNum=3, pageSize=2, startRow=4, endRow=6, total=15, pages=8, reasonable=false, pageSizeZero=false}
Student [sid=1005, sname=陳五]
Student [sid=1006, sname=楊六]

注意:導航頁碼數組中以3爲中心,向兩邊擴展,直至數組長度爲5;當 startPage(1,2) 或 startPage(2,2) 時,輸出的導航頁碼數組同上;但是,當 startPage(4,2) 時,導航頁碼數組爲:[2, 3, 4, 5, 6]。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章