不用插件
//当前页码private static final Integer currentPage = 2;//设置每页个数private static final Integer pageSize = 5;@Testpublic void test8() {//手写一个分页测试,不用插件List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22));for (int i = (currentPage-1)*pageSize; i < currentPage*pageSize; i++) {if (i>=list.size()){break;}Integer num = list.get(i);System.out.print(num+" ");}}
6 7 8 9 10
PageHelper插件
PageHelper 是一款开源的 MyBatis 分页插件。不可和mybatis-plus搭配用。
引入jar包
<!--分页--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.10</version> </dependency> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.10</version> </dependency><!-- 参数校验 --> <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version> </dependency>
配置文件
pagehelper:auto-dialect: mysqlreasonable: trueparams: count=countSqlsupport-methods-arguments: true
定义分页请求泛型类
import com.sun.istack.internal.NotNull;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.Valid;
import java.io.Serializable;@Data
@Api("分页请求对象")
public class PageRequest<T> implements Serializable {@ApiModelProperty(value = "当前页码",required = true,example = "1")@NotNullprivate Integer pageNum;@ApiModelProperty(value = "每页页数",required = true,example = "1")@NotNullprivate Integer pageSize;@Validprivate T data;}
案例
@PostMapping("pageTest")@ApiOperation("分页测试")public PageSerializable<UserInfoDTO> queryUserInfo(@RequestBody @Valid PageRequest<UserInfo> userInfoPageRequest){return duoService.listUserInfo(userInfoPageRequest);}
@Overridepublic PageSerializable<UserInfoDTO> listUserInfo(PageRequest<UserInfo> pageRequest) {//首先将前端传入的参数赋给目标对象UserInfoParam userInfoParam = new UserInfoParam();BeanUtils.copyProperties(pageRequest.getData(), userInfoParam);int userCount = duoMapper.selectNum(userInfoParam);//开启分页PageMethod.startPage(pageRequest.getPageNum(), pageRequest.getPageSize());//开始查询数据List<UserInfoDTO> listInfo = duoMapper.selectByInfo(userInfoParam);if (userCount == 0){return new PageSerializable<>();}PageSerializable<UserInfoDTO> pageSerializable = new PageSerializable<>();pageSerializable.setTotal(userCount);pageSerializable.setList(listInfo);return pageSerializable;}
startPage放在查询语句上面,因为插件的原理是在sql上拼接 limit 传进去两个参数,传入了当前页码数和每页显示的条数
比如
select * from user_info where area=? LIMIT ?, ?
swagger结果
优化分页代码
@Overridepublic PageSerializable<UserInfoDTO> listUserInfo(PageRequest<UserInfo> pageRequest) {//首先将前端传入的参数赋给目标对象UserInfoParam userInfoParam = new UserInfoParam();BeanUtils.copyProperties(pageRequest.getData(), userInfoParam);//开启分页PageMethod.startPage(pageRequest.getPageNum(), pageRequest.getPageSize());return new PageSerializable<>(duoMapper.selectByInfo(userInfoParam));}
这里用了Spring的拷贝函数,没有返回值,所以需要先实例化对象然后赋值。
import org.springframework.beans.BeanUtils;
BeanUtils.copyProperties(source,target);
把源对象source的属性值赋给目标对象target中与源对象source的中有着同属性名的属性,属性名和属性类型都相同的属性才能被成功拷贝赋值。
这样做的目的是为了保持传参的原始性,方便在复杂的业务逻辑中进行比对。
传递到后台的参数,应该要求有专门的类, 返回结果也应该有专门的类,比如
入参:userRequest
复制给 userParam 对象并传到mapper层
mapper层结果返回给 userDO 对象
最后返回给前端为 userDTO 对象
这是一种规范的传参过程
其他的拷贝的函数hutool
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.2</version> </dependency>
@Overridepublic PageSerializable<UserInfoDTO> listUserInfo2(PageRequest<UserInfo> pageRequest) {//首先将前端传入的参数赋给目标对象UserInfoParam userInfoParam = BeanUtil.copyProperties(pageRequest.getData(), UserInfoParam.class);//开启分页PageMethod.startPage(pageRequest.getPageNum(), pageRequest.getPageSize());return new PageSerializable<>(duoMapper.selectByInfo(userInfoParam));}
建议使用hutool,因为有返回值,不需要实例化对象了。