分页查询是一个非常普遍的操作,记得最开始实现分页的时候还是自己在JS中保存两个全局变量,用来记录当前页数和每页记录条数,然后在SQL中动态得去拼装LIMIT语句(MySQL),这个实现过程没有任何的业务逻辑,也没有任何的难度,但是就是很麻烦,后来慢慢得接触到了一些分页的插件,让这一过程变得非常的方便,大大地增加了开发的效率,今天就说一说Mybatis的分页插件PageHelper的使用。
首先说明一下PageHelper只能用于Mybatis,Hibernate使用的分页插件是Pageable(之后会分享其用法),测试的demo是搭建在SpringBoot上的,这里的重点就放在数据访问层上面,控制层、服务层这些就直接忽略,话不多说,进入正题。
首先贴出两个Mapper:
MyMapper.java
package priv.cwr.mapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 通用Mapper
* User: R
* Date: 2018/9/19
* Time: 15:22
* Created with IntelliJ IDEA.
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
MyMapper是抽出来的一个公用的接口,是为了使用Mybatis里面自带的一些方法和属性。
UserMapper.java
package priv.cwr.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import priv.cwr.model.db.UserEntity;
/**
* 用户Mapper
*/
@Mapper
@Repository
public interface UserMapper extends MyMapper<UserEntity> {
}
UserMapper就是和用户相关的Mapper。
UserEntity.java
package priv.cwr.model.db;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 用户实体类
*/
@Data
@Table(name = "t_user")
public class UserEntity {
@Id
@GeneratedValue(generator = "JDBC")
@Column(name = "user_id")
@JsonProperty("user_id")
private Long userId;
private String name;
private Integer gender;
private String phone;
private String note;
public String toString(){
return "user_id:" + this.userId
+ ",name:" + this.name
+ ",gender:" + this.gender
+ ",phone:" + this.phone
+ ",note:" + this.note;
}
}
测试方法
package priv.cwr;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import priv.cwr.mapper.UserMapper;
import priv.cwr.model.db.UserEntity;
@RunWith(SpringRunner.class)
@SpringBootTest
public class CwrUserCenterApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void contextLoads() {
Page<UserEntity> page1 = PageHelper.startPage(1,10)
.doSelectPage(() -> this.userMapper.selectAll());
System.out.println("page1 pageNumber -> 1 pageSize -> 10");
page1.forEach(System.out::println);
Page<UserEntity> page2 = PageHelper.startPage(1,2)
.doSelectPage(() -> this.userMapper.selectAll());
System.out.println("page2 pageNumber -> 1 pageSize -> 2");
page2.forEach(System.out::println);
}
}
结果如下
总结一下
PageHelper的调用链主要有两个方法:
startPage(int pageNum, int pageSize) :参数分别为查询页数和每页记录条数;
doSelectPage(ISelect select) :
selectAll()方法是Mybatis的SelectAllMapper接口中的一个方法,查询出了所有的用户信息(一共只有四条数据),两个相同的方法通过分页参数(pageNum和pageSize)的不同实现了分页查询。