1.pom中引入PageHelper插件的依赖。这里引入的不是单独的PageHelper包,而是整合到springboot后的,由于冗余了mybatis-spring-boot-starter
,在项目中如果没有引入mybatis的依赖。这里不用剔除掉。如果上面的pom中引入过,则这里要剔除掉。
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.3
org.mybatis.spring.boot
mybatis-spring-boot-starter
这里首先要知道PageHelper支持那些库的分页查询。可以看源码的类了解一下。
这里默认支持的有Db2,Hsql,Informix,MySql,Oracle,SqlServer常用数据库都包含在内。所以在整合springboot时,需要通过
设置断言来指定用的是啥数据库来执行分页。这里有两种方式:
第一种:在启动类Application.java中初始化指定.这种我不推荐用,而推荐第二种配置方式。
//配置mybatis的分页插件pageHelper
2 @Bean
3 public PageHelper pageHelper(){
4 PageHelper pageHelper = new PageHelper();
5 Properties properties = new Properties();
6 properties.setProperty("offsetAsPageNum","true");
7 properties.setProperty("rowBoundsWithCount","true");
8 properties.setProperty("reasonable","true");
9 properties.setProperty("dialect","mysql"); //配置mysql数据库的方言
10 pageHelper.setProperties(properties);
11 return pageHelper;
12 }
第二种:在application.yml配置文件中添加配置
pagehelper:
helperDialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql
这里就正式引入mysql的分页插件PageHelper了
2.下面是代码中的使用。
一般分页放在controller层,需要的分页参数为:pageIndex和pageSize。分页的操作也是通过PageHelper来执行的。List
这个方法是正常的条件查询方法。没有分页。执行的sql也没有分页的条件信息:
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@RequestMapping(value = "/listByPage")
public Result> listByPage(@RequestParam(value = "params") String params){
log.info("[ClassRoomController.listByPage],请求参数为{}",params);
ClassRoomQueryModel queryParam = ParamUtil.parseAndRequire(ClassRoomQueryModel.class,params,new String[]{"tid"});
if(queryParam.getPageIndex() == null){
queryParam.setPageIndex(0);
}
if(queryParam.getPageSize() == null){
queryParam.setPageSize(10);
}
PageHelper.startPage(queryParam.getPageIndex(),queryParam.getPageSize(),"create_time desc");
List classRooms = classRoomService.getClassRoomListByPage(queryParam);
PageInfo pageInfo = new PageInfo(classRooms);
return Result.success(new ResultPage<>(pageInfo.getTotal(),pageInfo.getPages(),pageInfo.getPageNum(),classRooms));
}
查询出来的分页信息,会放到contoller的统一实体类Result中返回。codeMsg为异常信息的常量类。
package com.zhanglf.catalog.common.result;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* @author zhanglf
* @date 2019-03-19
*/
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Result {
/**
* 返回代码
*/
private int code;
/**
* 返回消息
*/
private String msg;
/**
* 返回数据
*/
private T data;
/**
* 成功时候的调用
* */
public static Result success(T data){
return new Result(0,"success",data);
}
/**
* 成功时候的调用
* */
public static Result success(){
return new Result(0,"success",null);
}
/**
* 失败时候的调用
* */
public static Result error(CodeMsg codeMsg){
if(codeMsg == null) {
return null;
}
return new Result(codeMsg.getCode(),codeMsg.getMsg(),null);
}
}
package com.zhanglf.common.result;
import lombok.Getter;
/**
* @Description CodeMsg
* @author zhanglf
* @date 2019/3/19 15:18
*/
@Getter
public class CodeMsg {
//通用信息
/** 成功 */
public static CodeMsg SUCCESS = new CodeMsg(0, "success");
/** 服务器异常 */
public static CodeMsg SERVER_ERROR = new CodeMsg(500000,"服务端异常:%s");
/** 参数校验异常 */
public static CodeMsg BIND_ERROR = new CodeMsg(500001,"参数校验异常:%s");
/** 传入参数为空 */
public static CodeMsg PARAMS_IS_EMPTY = new CodeMsg(500002,"传入参数为空:%s");
/** 参数解析失败 */
public static CodeMsg PARAMS_PARSE_ERROR = new CodeMsg(500003,"参数解析失败:%s");
/** 调用接口异常 */
public static CodeMsg CALL_API_FAILED = new CodeMsg(500004,"调用接口异常:%s");
/** 返回参数为空或者不存在数据 */
public static CodeMsg CALL_API_EMPTY = new CodeMsg(500005,"返回参数为空或者不存在数据:%s");
/** 返回码 */
private int code;
/** 返回信息 */
private String msg;
/** 无参构造方法 */
private CodeMsg() {
}
/** 构造方法 */
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
/** 填充动态参数 */
public CodeMsg fillArgs(Object... args) {
int code = this.code;
String message = String.format(this.msg, args);
return new CodeMsg(code, message);
}
}
还有一个实体为ResultPage.
package com.zhanglf.catalog.common.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* 封装返回的分页数据
* @date 2019-03-13
* @author zhanglf
* @param 数据类型
*/
@Data
@AllArgsConstructor
public class ResultPage {
/**
* 总条数
*/
private Long totalCount;
/**
* 总页数
*/
private Integer totalPage;
/**
* 当前页
*/
private Integer curPage;
/**
* 分页数据
*/
private List list;
}