pageHelper是一款非常方便的mybatis分页插件,能够很方便的实现分页效果。
pageHelper使用步骤
-
在pom.xml中添加pagehelper-spring-boot的依赖包
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency>
-
配置application.properties
# 分页配置 # 指定数据库,不指定的话会默认自动检测数据库类型 pagehelper.helperDialect=mysql # 是否启用分页合理化。 # 如果启用,当pagenum<1时,会自动查询第一页的数据,当pagenum>pages时,自动查询最后一页数据; # 不启用的,以上两种情况都会返回空数据 pagehelper.reasonable=true # 默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 pagehelper.supportMethodsArguments=true # 用于从对象中根据属性名取值, # 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, # 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero #pagehelper.params=count=countSql
-
分页代码
public PageInfo<Entity> getPageInfoList(int page, int size) { //启动分页 PageHelper.startPage(page, size); //使用mybatis的Mapper进行数据查询得到列表,并指定导航导航页码数,来创建PageInfo对象(这里的Entity代指需要查询的实体对象) PageInfo<Entity> pageInfo = new PageInfo<>(entityMapper.getAllEntity(), 5); return pageInfo; }
-
controller层的代码
//没有输入页码的情况 @GetMapping(value = {"/{page:[0-9]*}","/"}) public String index(@PathVariable(required = false) Integer page, Model model) { page = null == page ? 1 : page; //通过service得到pageInfo PageInfo<QuestionDTO> pageInfo = questionService.getquestionDTOPageInfo(page, size); //传入model中供前台使用 model.addAttribute("pageInfo", pageInfo); return "index"; }
pageInfo<>泛型转换
由于后台传到前台的数据一般不会是查询数据库直接得到的实体类,而是通过DTO类对数据进行二次封装后传递给前台,因此需要将pageInfo<>的泛型转换成相应的DTO类。
转换的思路及代码,(参考了博客https://www.cnblogs.com/tassel/p/12038087.html)
public class PageInfoUtil {
/**
* pageInfo泛型转换
*
* @param pageInfoE pageInfo<E>类对象
* @param Dclz DTO类的class对象
* @param <E> entity类
* @param <D> DTO类
* @return
*/
public static <E, D> PageInfo<D> pageInfo2DTO(PageInfo<E> pageInfoE, Class<D> Dclz) {
//创建page对象,传入当前页,和每页数量进行初始化(page对象是ArrayList的子类,在ArrayList的基础上添加了分页的信息)
Page<D> page = new Page<>(pageInfoE.getPageNum(), pageInfoE.getPageSize());
//传入总记录数
page.setTotal(pageInfoE.getTotal());
//遍历原entity的列表
for (E e : pageInfoE.getList()) {
try {
//通过class对象生成DTO的对象
D d = Dclz.getConstructor().newInstance();
//使用BeanUtils将entity中与dto相同的属性拷贝到dto中并放入page列表
BeanUtils.copyProperties(e, d);
page.add(d);
} catch (Exception ex) {
ex.printStackTrace();
}
}
//通过page对象以及pageInfoE中的导航页码数创建要返回的pageInfo<D>对象
return new PageInfo<D>(page, pageInfoE.getNavigatePages());
}
}
举例
定义entity类和dto类
eneity类
public class Question {
private long id;
private String title;
private String description;
private long creatorId;
}
dto类
public class QuestionDTO {
private long id;
private String title;
private String description;
private String creatorName;
}
service代码
/**
* @Author rainc
* @create 2020/1/15 15:33
*/
@Service
public class QuestionService implements QuestionServiceImpl {
@Autowired
QuestionMapper questionMapper;
@Autowired
UserMapper userMapper;
@Override
public PageInfo<QuestionDTO> getquestionDTOPageInfo(int page, int size) {
//开始分页
PageHelper.startPage(page, size);
//查询并生成pageInfo
PageInfo<Question> questionpageInfo = new PageInfo<>(questionMapper.getAllQuestions(), 5);
return getquestionDTOPageInfo(questionpageInfo);
}
@Override
public PageInfo<QuestionDTO> getquestionDTOPageInfo(PageInfo<Question> pageInfo) {
//使用PageInfoUtil将entity转为dto
PageInfo<QuestionDTO> questionDTOPageInfo = PageInfoUtil.pageInfo2DTO(pageInfo, QuestionDTO.class);
//添加新增的属性
for (QuestionDTO questionDTO : questionDTOPageInfo.getList()) {
User user = userMapper.findByID(questionDTO.getCreator());
questionDTO.setUser(user.getName());
}
return questionDTOPageInfo;
}
}
主要通过PageInfoUtil将原本的entity转为dto,在其基础上通过遍历添加其它dto独有的新属性。
个人博客:https://www.rainc.top/2020/02/13/java-study/springBoot-pageInfo