网上有很多pagehelper、通用mapper这些与springboot整合的例子,这里结合自己使用的一些习惯进行整理。
关于pageHelper的使用,其官方文档中介绍的比较清楚,地址为:https://pagehelper.github.io/docs/howtouse/
这里我只介绍一些比较容易忽略的点:
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>(); /** * 设置 Page 参数 * * @param page */ protected static void setLocalPage(Page page) { LOCAL_PAGE.set(page); }
在拦截器中通过操作io处理线程的threadLocal变量来获取分页参数的,这里关于threadLocal的坑,在之前讲注入用户信息时有介绍过,在这就不再聊了,需要了解的自行翻阅历史文章查看。
//支持 ServletRequest,Map,POJO 对象,需要配合 params 参数PageHelper.startPage(request);//紧跟着的第一个select方法会被分页// 可以使用((Page) list强转成Page类型List<Country> list = countryMapper.selectIf(1);//后面的不会被分页,除非再次调用PageHelper.startPage//这里返回的是Collection类型List<Country> list2 = countryMapper.selectIf(null);
Page类的介绍:
public class Page<E> extends ArrayList<E> implements Closeable
在这里需要注意的一点是:Page是List的子类,在分页时,实际返回的结果list类型是Page,如果想取出分页信息,需要强制转换为Page或者使用PageInfo(内部也是转成Page来处理的)
//获取第1页,10条内容,默认查询总数countPageHelper.startPage(1, 10);List<Country> list = countryMapper.selectAll();//用PageInfo对结果进行包装PageInfo page = new PageInfo(list);//测试PageInfo全部属性//PageInfo包含了非常全面的分页属性
看下PageInfo的代码就一目了然了:
/** * 包装Page对象 * * @param list page结果 * @param navigatePages 页码数量 */ public PageInfo(List<T> list, int navigatePages) { if (list instanceof Page) { Page page = (Page) list; this.pageNum = page.getPageNum(); this.pageSize = page.getPageSize(); this.pages = page.getPages(); this.list = page; this.size = page.size(); this.total = page.getTotal(); //由于结果是>startRow的,所以实际的需要+1 if (this.size == 0) { this.startRow = 0; this.endRow = 0; } else { this.startRow = page.getStartRow() + 1; //计算实际的endRow(最后一页的时候特殊) this.endRow = this.startRow - 1 + this.size; } } else if (list instanceof Collection) { this.pageNum = 1; this.pageSize = list.size(); this.pages = this.pageSize > 0 ? 1 : 0; this.list = list; this.size = list.size(); this.total = list.size(); this.startRow = 0; this.endRow = list.size() > 0 ? list.size() - 1 : 0; } if (list instanceof Collection) { this.navigatePages = navigatePages; //计算导航页 calcNavigatepageNums(); //计算前后页,第一页,最后一页 calcPage(); //判断页面边界 judgePageBoudary(); } }
可以看到,在将list传入PageInfo时,会根据list的原始类型进行转变,从而获取分页信息。
配置文件时代,pageHelper主要是在myibatis的配置文件中存在的。在springboot中,与pagehelper的整合方式如下:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version></dependency><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-autoconfigure</artifactId> <version>1.2.3</version></dependency><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version></dependency>
pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
PageHelper.startPage(1, 10);List<UserEntity> users=userMapper.getAll();PageInfo<UserEntity> pageInfo = new PageInfo<UserEntity>(users);
关于原因,看看下面这个类就清晰了:
依赖:
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>3.4.3</version></dependency><dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>1.2.3</version></dependency>
启动类上加上注解:
@MapperScan(value = "com.*.dao.mapper",markerInterface = BaseMapper.class)
然后就可以正常使用通用mapper了。
见官方文档:https://github.com/abel533/Mapper/wiki/1.integration