springBoot使用pageHelper进行分页和pageInfo泛型转换方法

pageHelper是一款非常方便的mybatis分页插件,能够很方便的实现分页效果。

pageHelper使用步骤

  1. 在pom.xml中添加pagehelper-spring-boot的依赖包

            
                com.github.pagehelper
                pagehelper-spring-boot-starter
                1.2.13
            
    
  2. 配置application.properties

    # 分页配置
    # 指定数据库,不指定的话会默认自动检测数据库类型
    pagehelper.helperDialect=mysql
    # 是否启用分页合理化。
    # 如果启用,当pagenum<1时,会自动查询第一页的数据,当pagenum>pages时,自动查询最后一页数据;
    # 不启用的,以上两种情况都会返回空数据
    pagehelper.reasonable=true
    # 默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
    pagehelper.supportMethodsArguments=true
    # 用于从对象中根据属性名取值,
    # 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
    # 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
    #pagehelper.params=count=countSql
    
  3. 分页代码

        public PageInfo getPageInfoList(int page, int size) {
            //启动分页
            PageHelper.startPage(page, size);
            //使用mybatis的Mapper进行数据查询得到列表,并指定导航导航页码数,来创建PageInfo对象(这里的Entity代指需要查询的实体对象)
            PageInfo pageInfo = new PageInfo<>(entityMapper.getAllEntity(), 5);
            return pageInfo;
        }
    
  4. controller层的代码

        //没有输入页码的情况
     @GetMapping(value = {"/{page:[0-9]*}","/"})
     public String index(@PathVariable(required = false) Integer page, Model model) {
         page = null == page ? 1 : page;
         //通过service得到pageInfo
         PageInfo pageInfo = questionService.getquestionDTOPageInfo(page, size);
         //传入model中供前台使用
         model.addAttribute("pageInfo", pageInfo);
         return "index";
     }
    

pageInfo<>泛型转换

由于后台传到前台的数据一般不会是查询数据库直接得到的实体类,而是通过DTO类对数据进行二次封装后传递给前台,因此需要将pageInfo<>的泛型转换成相应的DTO类。

转换的思路及代码,(参考了博客https://www.cnblogs.com/tassel/p/12038087.html)

public class PageInfoUtil {
    /**
     * pageInfo泛型转换
     *
     * @param pageInfoE pageInfo类对象
     * @param Dclz      DTO类的class对象
     * @param        entity类
     * @param        DTO类
     * @return
     */
    public static  PageInfo pageInfo2DTO(PageInfo pageInfoE, Class Dclz) {
        //创建page对象,传入当前页,和每页数量进行初始化(page对象是ArrayList的子类,在ArrayList的基础上添加了分页的信息)
        Page page = new Page<>(pageInfoE.getPageNum(), pageInfoE.getPageSize());
        //传入总记录数
        page.setTotal(pageInfoE.getTotal());
        //遍历原entity的列表
        for (E e : pageInfoE.getList()) {
            try {
                //通过class对象生成DTO的对象
                D d = Dclz.getConstructor().newInstance();
                //使用BeanUtils将entity中与dto相同的属性拷贝到dto中并放入page列表
                BeanUtils.copyProperties(e, d);
                page.add(d);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        //通过page对象以及pageInfoE中的导航页码数创建要返回的pageInfo对象
        return new PageInfo(page, pageInfoE.getNavigatePages());
    }
}

举例

定义entity类和dto类

eneity类

public class Question {
    private long id;
    private String title;
    private String description;
    private long creatorId;
}

dto类

public class QuestionDTO {
    private long id;
    private String title;
    private String description;
    private String creatorName;
}

service代码

/**
 * @Author rainc
 * @create 2020/1/15 15:33
 */
@Service
public class QuestionService implements QuestionServiceImpl {
    @Autowired
    QuestionMapper questionMapper;
    @Autowired
    UserMapper userMapper;

    @Override
    public PageInfo getquestionDTOPageInfo(int page, int size) {
        //开始分页
        PageHelper.startPage(page, size);
         //查询并生成pageInfo
        PageInfo questionpageInfo = new PageInfo<>(questionMapper.getAllQuestions(), 5);
        return getquestionDTOPageInfo(questionpageInfo);
    }

    @Override
    public PageInfo getquestionDTOPageInfo(PageInfo pageInfo) {
        //使用PageInfoUtil将entity转为dto
        PageInfo questionDTOPageInfo = PageInfoUtil.pageInfo2DTO(pageInfo, QuestionDTO.class);
        //添加新增的属性
        for (QuestionDTO questionDTO : questionDTOPageInfo.getList()) {
            User user = userMapper.findByID(questionDTO.getCreator());
            questionDTO.setUser(user.getName());
        }
        return questionDTOPageInfo;
    }
}

主要通过PageInfoUtil将原本的entity转为dto,在其基础上通过遍历添加其它dto独有的新属性。

个人博客:https://www.rainc.top/2020/02/13/java-study/springBoot-pageInfo

你可能感兴趣的:(springBoot使用pageHelper进行分页和pageInfo泛型转换方法)