思考:为什么需要分页?
在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
不同的数据库使用sql分页的方式也不一样。
Mysql使用Limit实现分页
-- 语法
SELECT * FROM table LIMIT stratIndex,pageSize
-- 检索记录行 6-15
SELECT * FROM table LIMIT 5,10;
-- 为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
-- 检索记录行 96-last.
SELECT * FROM table LIMIT 95,-1;
-- 如果只给定一个参数,它表示返回最大的记录行数目:
-- 检索前 5 个记录行
SELECT * FROM table LIMIT 5;
-- 换句话说,LIMIT n 等价于 LIMIT 0,n。
//分页查询
List<User> selectUserLimit(Map<String,Integer> map);
<select id="selectUserLimit" resultType="com.sin.pojo.User" parameterType="map">
select * from user limit #{startIndex},#{pageSize}
select>
//分页查询 , 两个参数startIndex , pageSize
@Test
public void selectUserLimit(){
SqlSession session = MyBatisUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int currentPage = 1; //第几页
int pageSize = 2; //每页显示几个
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("startIndex",(currentPage-1)*pageSize);
map.put("pageSize",pageSize);
List<User> users = mapper.selectUserLimit(map);
for (User user: users){
System.out.println(user);
}
session.close();
}
官方文档:https://pagehelper.github.io/
支持常见的 12 种数据库。Oracle,MySql,MariaDB,SQLite,DB2,PostgreSQL,SqlServer 等
使用方法:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.2.1version>
dependency>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
plugin>
plugins>
public interface StudentMapper {
//获取所有学生及对应老师的信息
public List<Student> getStudents();
}
<select id="getStudents" resultMap="StudentTeacher">
select * from student
select>
@Test
public void selectUser2(){
/**
* 开始分页
* @param pageNum = 1 页码
* @param pageSize = 5 每页显示数量
*/
PageHelper.startPage(1,5);
SqlSession session = MyBatisUtil.getSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> users = mapper.getStudents();
PageInfo<Student> info = new PageInfo<>(users);
System.out.println("当前页"+info.getPageNum());
System.out.println("每页的数量"+info.getPageSize());
System.out.println("当前页的数量"+info.getSize());
System.out.println("总页数"+info.getPages());
System.out.println("上一页"+info.getPrePage());
System.out.println("下一页"+info.getNextPage());
//所有导航页号
int[] nums = info.getNavigatepageNums();
for (int num : nums) {
System.out.println("第"+num+"页");
}
users.forEach(user -> System.out.println(user));
}