mybatis-plus中分页(借助pagehelper插件)

mybatis-plus中分页(借助pagehelper插件,属于mybatis中分页,需要自定义sql语句)


springboot项目导入的依赖:
		<dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelper-spring-boot-starterartifactId>
            <version>1.3.0version>
        dependency>

普通maven项目:

	<dependency>
      <groupId>com.github.pagehelpergroupId>
      <artifactId>pagehelperartifactId>
      <version>4.2.1version>
    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调用截图:
mybatis-plus中分页(借助pagehelper插件)_第1张图片

讲解

mybatis-plus中分页(借助pagehelper插件)_第2张图片
仔细一看发现,pageHelper插件会拦截第一个select语句,进行总数统计以及自动加入物理分页limit语句,返回的list集合也不是普通的list,而是Page对象。该Page对象是ArrayList的子类,此处是用父类接收子类对象。
mybatis-plus中分页(借助pagehelper插件)_第3张图片
mybatis-plus中分页(借助pagehelper插件)_第4张图片
然后初始化这个PageInfo对象的时候,会向下转型;给各属性进行赋值;
mybatis-plus中分页(借助pagehelper插件)_第5张图片
mybatis-plus中分页(借助pagehelper插件)_第6张图片
在测试中我们发现,第二个select语句并没有进行拦截,后续的setList方法,只是将pageInfo对象中的list属性进行重新赋值(这一点我们可以利用进行查出来的数据进行处理重新封装,进行赋值)。

拓展:
mybatis-plus中分页(借助pagehelper插件)_第7张图片

自定义分页,可以根据PageHelper.startPage()所返回的Page对象,获取total总数,以及list内容对象进行重新封装返回给前端;

你可能感兴趣的:(电信规划设计院,mybatis)