mybatis-plus中分页(借助pagehelper插件,属于mybatis中分页,需要自定义sql语句)
springboot项目导入的依赖:
<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内容对象进行重新封装返回给前端;