一、MyBatis实现分页
1、关于逻辑分类和物理分页
分页可分为逻辑分页和物理分页:
**逻辑分页:**是一次性把全部数据查询加载进内存 ,然后再进行分页。这样优点是减少IO次数,适合频繁访问、数据量少的情况。缺点是不适合大数据量,容易造成内存溢出。
**物理分页:**是利用limit语法在数据库中进行分页。他的优点是适合分页大数据量数据。缺点是频繁查询数据库,消耗性能。
2、Mybatis实现分页功能
mybatis实现分页有三种方式:
- 直接使用SQL语句,利用limit关键字分页(物理分页)
- RowBounds(逻辑分页)
- 第三方插件PageHelper(物理分页)
2.1 SQL语句实现分页
limit语法 limit [offset,] rows
offset 偏移量,从第条数据开始,默认为0
rows 行数,要拿多少条数据
mapper接口中:意思就是 从第几行开始拿多少条数据。
java
@Select("select count(*) from emp ")
int countEmp();
@Select("select * from emp limit #{offset},#{rows} ")
List<Emp> pageEmp(@Param("offset") int offset,@Param("rows") int rows);
如果我们要实现分页逻辑,一般前端会传 pageNum(第几页) , pageSize(多少条数据)。我们需要自己计算分页逻辑。
比如我们接受到的 pageNum = 3 ,pageSzie = 5:
java
int pageNum = 3; //查第3页
int pageSize = 5; //每页显示5条数据
int count = empMapper.countEmp(); //总条数
//计算共有多少页 +1是因为如果相除有余数 就等于多了一页,这里粗略计算为多一页
int pagesNum = (count / pageSize) + 1;
// 这页的偏移量offset是多少 , 也就是从第几条开始
int offset = (pageNum - 1) * pageSize; //偏移量
List<Emp> roles = empMapper.pageEmp(offset,pagesNum);
System.out.println(roles);
//最后把分页数据封装到Page类中返回,这里不做演示
这种方式缺点是比较麻烦,要自己计算分页数据和封装Page类。优点是自定义性强。