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.jar、log4j-1.2.17.jar、 mybatis-3.4.1.jar、pagehelper-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 表中數據如下:
首先介紹下公共的文件,主要包含 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]。