赞
踩
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
普通maven项目:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>
示例:
//Controlller API接口:
@ApiOperation("系统日志-分页查询")
@PostMapping("/page")
public R<PageInfo<SysLog>> page(SysLogDTO dto, Query query){
int page = query.getCurrent() == null ? 1 : query.getCurrent();
int pageSize = query.getSize() == null ? 10 : query.getSize();
PageInfo<SysLog> logPageInfo = logService.selectPage(dto, page, pageSize);
return R.data(logPageInfo);
}
首先了解一下Query这个对象,它是一个我应用框架中封装好的对象。我们可以看到 Query 有四个字段,分别代表 当前页 , 每页的数量 , 排序的字段名 , 排序方式。如果我们需要查第 2 页,并且每页数量为 2 条,只需要传入对应的属性值current=2和size=2
@Data @Accessors(chain = true) @ApiModel(description = "查询条件") public class Query { /*** 当前页 */ @ApiModelProperty(value = "当前页") private Integer current; /*** 每页的数量 */ @ApiModelProperty(value = "每页的数量") private Integer size; /*** 排序的字段名 */ @ApiModelProperty(hidden = true) private String ascs; /*** 排序方式 */ @ApiModelProperty(hidden = true) private String descs; }
这里的一个高明之处:在service里面不是直接调用mapper中提供的一些方法,而是自定义了一个selectPage(SysLog sysLog)方法,它可以有一些条件判断,连表查询sql语句;我们的分页语句limit是由分页插件帮我们加的,不影响
//Service层 @Service @AllArgsConstructor public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements ISysLogService { private SysLogMapper mapper; @Override public PageInfo<SysLog> selectPage(SysLogDTO sysLogDTO, int page, int pageSize) { PageHelper.startPage(page, pageSize); //这里通过调用PageHelper的静态方法,设置了PageHelper的起始页以及每页的数量 List<SysLog> list = mapper.selectPage(sysLogDTO); PageInfo<SysLog> pageInfo = new PageInfo<>(list); //这里用查询出来的数据初始化PageInfo对象,由PageInfo自动帮我们完成分页数据的采集。这里最后得到的pageInfo里面存储着的便是我们想要获取的该页的数据。 return pageInfo; } }
//mapper层 public interface SysLogMapper extends BaseMapper<SysLog> { List<SysLog> selectPage(SysLogDTO logDTO); int add(SysLog log); } //mapper.xml文件 <!-- 通用查询映射结果 --> <resultMap id="LogResultMap" type="org.springblade.iot.entity.SysLog"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <result column="ip" property="ip"/> <result column="type" property="type"/> <result column="text" property="text"/> <result column="create_time" property="createTime"/> <result column="param" property="param"/> </resultMap> <select id="selectPage" parameterType="org.springblade.iot.dto.SysLogDTO" resultMap="LogResultMap"> select * from sys_log <where> <if test="userName!=null and userName!=''"> and user_name like concat('%',#{userName},'%') </if> <if test="type!=null and type!=''"> and `type` like concat('%',#{type},'%') </if> </where> order by create_time desc </select>
postman调用截图:
仔细一看发现,pageHelper插件会拦截第一个select语句,进行总数统计以及自动加入物理分页limit语句,返回的list集合也不是普通的list,而是Page对象。该Page对象是ArrayList的子类,此处是用父类接收子类对象。
然后初始化这个PageInfo对象的时候,会向下转型;给各属性进行赋值;
在测试中我们发现,第二个select语句并没有进行拦截,后续的setList方法,只是将pageInfo对象中的list属性进行重新赋值(这一点我们可以利用进行查出来的数据进行处理重新封装,进行赋值)。
拓展:
自定义分页,可以根据PageHelper.startPage()所返回的Page对象,获取total总数,以及list内容对象进行重新封装返回给前端;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。