阅读 23

springmvc分页,springboot实现商品排序

1 .如何在不使用插件的情况下实现寻呼?

使用PageHelper开源、Mybatis分页插件支持多个物理数据库

3.springboot集成页帮助器的步骤如下

1 .部署在dependencygroupidcom.github.page helper/groupidartifactidpagehelper-spring-boot-starter/创建依赖于artifactidversion1的dependency2.1寻呼方法参与方pageparamimplementsipagesetorderby 2.2寻呼方法接口在PageService page list2.3业务服务器上执行

import com.github.page helper.ipage; import lombok.Data; import lombok.experimental.accessors; /**注释@accessorsentity伪Build,例如:entity.setx(x ).sety(y ) *@paramt(/@data@accessors ) chain=true description='页码',default value=1*/privateintegerpagenum=1; /** description='页数',default value=20 */privateintegerpagesize=20; /** description='排序',example=' id desc ' */privatestring order by; /** description='查询条件参数' */private T param; /**在此优化优化详细信息,并选择*/publicpageparamtsetorderby (string order by ) { this.orderBy=orderBy; return this; } 3.2页面服务

import com.github.page helper.page helper; import com.github.page helper.page info; import java.util.List; /** * @param Param总称request * @param Result总称response */publicinterfacepageserviceparam, Result { /** *寻呼查询* default关键字是默认实现* * @param param请求参数DTO * @return寻呼集*/直接声明defaultpageinforesultpage (pageparamparam ) { returnpagehelper.start page (param ).doSelectPageInfo () -list } /** *集合查询* * @param param查询参数* @return查询响应*/listresultlist(paramparam ); } 3.3控制器

//PageParam包含分页参数和查询条件参数@ get mapping (/pagetest/page/{ page }/size/{ size } ) ) APIoperation ) value=(寻呼查询测试) )的publicresponseresultpagetest (pageparamstudentdopageparam )

publicinterfaceistudentserviceextendspageservicestudentdo,student do { liststudentgetallstudent }; } @ servicepublicclasstudentservicei

mpl implements IStudentService { @Autowired(required = false) StudentMapper studentMapper; @Override public List<Student> getAllStudent() { return studentMapper.getAllStudent(); } /** * 分页查询获取数据集合 * * @param o * @return */ @Override public List list(StudentDO o) { return studentMapper.getAllStudent(); }}

 4.1执行过程

执行过程1.controller接收分页参数和查询条件参数PageParam<StudentDO> pageParam,传给studentService.page(pageParam) PageParam<StudentDO> pageParam的泛型StudentDO是查询条件参数的类型,通常都是封装成DTO page方法是通过pageService接口继承而来的,该方法会调用分页的组件 PageHelper.startPage(param).doSelectPageInfo(() -> list(param.getParam()));2.service方法的执行过程 PageHelper.startPage(param).doSelectPageInfo(() -> list(param.getParam())); 1.doSelectPageInfo参数是通过lambda表达式传递,传递的是不分页的查询结果数据集合 2.然后转换成分页数据 3.实际开发时,要做的事就是重写list方法,获取数据集合,传递泛型 泛型: controller参数的泛型是查询参数类型 service泛型第一个是查询参数类型(list方法参数类型) 第二个参数是查询数据结果类型(list方法返回值的集合中数据的类型)

4.2源码分析

如果只是简单应用,可以不看这些,但如果要真正理解插件的操作,需要了解源码的执行逻辑主要需要了解的显然就是PageHelper执行的特有方法干了什么1.startPagepublic static <E> Page<E> startPage(Object params) { //获取page Page<E> page = PageObjectUtil.getPageFromObject(params, true); //获取旧分页 Page<E> oldPage = getLocalPage(); //如果旧分页只排序不分页,则将排序参数放入新分页中 if (oldPage != null && oldPage.isOrderByOnly()) { page.setOrderBy(oldPage.getOrderBy()); } //组装新分页 setLocalPage(page); return page;}1.1getPageFromObject 1.该方法先判断分页参数集合params是否为null 2.如果不为null,则判断是否为IPage类型,是则获取pageNum,pageSize分页参数组合成page 3.返回page用来分页 4.如果上述条件不能满足,那么会通过反射获取分页的参数public static <T> Page<T> getPageFromObject(Object params, boolean required) { //判断分页参数是否为null if (params == null) { throw new PageException("无法获取分页查询参数!"); //如果分页参数不为null,判断是否为IPage类型 } else if (params instanceof IPage) { //组合新的Page,包括pageNum,PageSize IPage pageParams = (IPage)params; Page page = null; if (pageParams.getPageNum() != null && pageParams.getPageSize() != null) { page = new Page(pageParams.getPageNum(), pageParams.getPageSize()); } if (StringUtil.isNotEmpty(pageParams.getOrderBy())) { if (page != null) { page.setOrderBy(pageParams.getOrderBy()); } else { page = new Page(); page.setOrderBy(pageParams.getOrderBy()); page.setOrderByOnly(true); } } return page; } else { ... ... }1.2startPage剩余代码获取当前线程中的Page,即旧的分页如果有旧的分页,再判断旧的分页是否只有排序参数,即是否是只排序不分页如果是这样,就把排序参数放入新分页中2.doSelectPageInfo(ISelect select)//明确:这是page的方法,参数是个函数式接口public <E> PageInfo<E> doSelectPageInfo(ISelect select) { select.doSelect(); return this.toPageInfo();}2.1doSelectPageInfo(ISelect select)的参数ISelect作为函数式接口,接收lambda表达式传递的函数 第一步就是调用这个传递的函数,即select.doSelect();获取要分页的数据集合 第二步return this.toPageInfo();转为分页形式 这里就会产生疑问,为什么调用select.doSelect();之后不做任何操作就直接开始返回分页数据了? 实际上PageHelper分页的操作是通过MyBatis拦截器来做的 在select.doSelect();执行时,会触发PageHelper定义的MyBatis拦截器,PageHelper会根据数据库方言,解析数据,实现分页3.Mybatis拦截器@Intercepts({@Signature( type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), @Signature( type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})})public class PageInterceptor implements Interceptor { private volatile Dialect dialect; private String countSuffix = "_COUNT"; protected Cache<String, MappedStatement> msCountMap = null; private String default_dialect_class = "com.github.pagehelper.PageHelper"; public PageInterceptor() { } public Object intercept(Invocation invocation) throws Throwable { ... ... }}

 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐