因为我是写一个项目需要这个分页功能,需要了解一下所以我去学习了一下,
个人认为虽然现成的封装方法用起来很方便但是我们作为这个方面的初学者,我们也需要去了解是怎写出来的,(当然正式的写项目的时候,需要统一化就使用封装好的就可以了)
手写
controller层
@GetMapping("/page")
public Page<User> findByPage(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize){
Integer offset=(pageNum - 1) * pageSize;
List<User> userData = userMapper.findByPage(offset,pageSize);
Page<User> page = new Page<>();
page.setData(userData);
Integer total = userMapper.countUser();
page.setTotal(total);
page.setPageNum(pageNum);
page.setPageSize(pageSize);
return page;
}
关键代码
因为pageNum代表的页码所以是1,2,3,4,5等等,而pageSize代表的是每一页需要的数据量,
在mysql上limit语法需要两个参数SELECT * FROM `user` limit #{a} ,#{b},第一个代表偏移值,第二个代表从偏移值这个地方一下需要多少数据,而这个段代码因为mysql数据是从第0个开始计算的,所以需要减1,乘上pageSize代表着从第a页的第一条数据开始读取b条数据,这个可能比较抽象,大家努力想一想吧
Integer offset = (pageNum - 1) * pageSize;
mapper(Dao层)
这里要强调一下,我最初没有添加@Param而是直接定义的导致出现bug,
我去查阅了一下,发现@param的用途是作为Dao层的注解,作用是用于传递参数,从而可以与mysql的字段名相对应,简单来说就是,可以对参数命名,起什么名字都可以,当前参数或者自定的,然后Mybatis通过参数的名称,在拼接sql语句的时候进行对号入座。
不使用@param参数的话,Mybatis在进行sql操作的时候找不到对应参数,会导致报错
@Select("SELECT * FROM `user` limit #{offset},#{pageSize}")
List<User> findByPage(@Param("offset") Integer offset,
@Param("pageSize") Integer pageSize);
//count(id)通过id获取到数据总数
@Select("select count(id) from user")
Integer countUser();
User.java
用户数据
@Data
public class User {
//Data自动生成javabean不需要再写无参构造和有参构造set和get
private Integer id;
private String name;
private String address;
private Integer age;
private String sex;
private String phone;
}
Page.java
分页数据
@Data
public class Page<T> {
private Integer pageNum;
private Integer pageSize;
private Integer total;
private List<T> data;
}
运行结果: