mybatis通用mapper中实现分页

作者: 小疯子 分类: mybatis 发布时间: 2019-01-09 20:14

一、前言

这里用的在spring boot下mybatis是tk.mybatis通用mapper中实现的简单分页

二、代码

  1. 首先添加依赖于项目下的pom.xml中,其他复杂的sql还是需要用原始的mybatis所以我也就一起加了
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>2.1.0</version>
    </dependency>

    这个是辅助获取分页信息的依赖也加上

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.3</version>
    </dependency>
  2. 添加个分页实体类用于前端传入分页的信息
    package com.xiaofeng.pro.common.vo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * @program: people
     * @description: 分页实体
     * @author: dongxiaofeng
     * @create: 2018-12-05-11-00
     */
    @Data
    public class PageVo implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Integer pageNumber;//页码号
    
        private Integer pageSize;//页面大小
    
        private String sort;//排序字段
    
        private String order;//排序方式 asc/desc
    }
  3. Controller中添加方法来实现分页以及条件搜索的请求,请求路径可以为:http://域名/某某/getByCondition?pageNumber=1&pageSize=6&startDate=2018-05-02&endDate=2018-05-04
    /**
     * 多条件分页获取用户列表
     */
    @RequestMapping(value = "/getByCondition", method = RequestMethod.GET)
    public Result<PageInfo<User>> getByCondition(@ModelAttribute User user,
                                         @ModelAttribute SearchVo searchVo,
                                         @ModelAttribute PageVo pageVo){
    
        List<User> userlist = userService.findByCondition(user, searchVo, pageVo);
        for(User u : userlist){
            //关联部门 还没开发
            if(StringUtil.isNotEmpty(u.getDepartmentId())){
                //Department department =
            }
            //关联角色
            List<Role> list = userRoleMapper.findByUserId(u.getId());
            u.setRoles(list);
        }
        PageInfo<User> pageinfo;
        if(userlist != null && userlist.size() > 0){
            pageinfo = new PageInfo<User>(userlist);
        }else{
            pageinfo = new PageInfo<User>();
        }
        return new ResultUtil<PageInfo<User>>().setData(pageinfo);
    }

    其中的SearchVo是个开始结束时间的实体,可以忽略和分页无关,贴上来:

    @Data
    public class SearchVo implements Serializable {
        private String startDate;
    
        private String endDate;
    }
  4. 以上的UserService.findByCondition的实现代码如下:
    @Override
    public List<User> findByCondition(User user, SearchVo searchVo, PageVo pageVo){
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        //性别、类型什么的条件先不添加了
        if(StringUtil.isNotEmpty(user.getUsername())){
            criteria.andLike("username", "%" + user.getUsername() + "%");
        }
        if(StringUtil.isNotEmpty(user.getMobile())){
            criteria.andLike("mobile", "%" + user.getMobile() + "%");
        }
        if(StringUtil.isNotEmpty(user.getEmail())){
            criteria.andLike("email", "%" + user.getEmail() + "%");
        }
    
        if(StringUtil.isNotEmpty(searchVo.getStartDate()) && StringUtil.isNotEmpty(searchVo.getEndDate())){
            criteria.andGreaterThan("createTime",searchVo.getStartDate()).andLessThan("createTime",searchVo.getEndDate());
        }
        RowBounds rowBounds = new RowBounds((pageVo.getPageNumber()-1)*pageVo.getPageSize(), pageVo.getPageSize());
        List<User> userlist =  userDao.selectByExampleAndRowBounds(example, rowBounds);//mapper自带的方法
        return userlist;
    }
  5. UserDao的实现,集成个通用的MyBaseDao接口
    public interface UserDao extends MyBaseDao<User,Long> {
    }
    public interface MyBaseDao<T, ID extends Serializable> extends Mapper<T> {
    }

三、参考资料

Spring Boot集成MyBatis的基础项目:https://github.com/abel533/MyBatis-Spring-Boot
https://github.com/abel533/Mapper/

Mybatis通用Mapper介绍与使用:https://blog.csdn.net/dwf_android/article/details/79359360

MyBatis 为什么需要通用 Mapper :https://blog.csdn.net/isea533/article/details/83045335


2019-02-16 使用时出现了一个问题,返回的分页相关信息中的total值总是为-1,不知道什么原因也可能是有内部的bug我没有能力调试,所以更改了一下分页的实现

将service层中的findByCondition更改为

public List<OrganizationType> findByCondition(OrganizationType organizationType, SearchVo searchVo, PageVo pageVo) {
    PageHelper.startPage(pageVo.getPageNumber(), pageVo.getPageSize()); //添加上这个之后会对它下面的第一个select语句进行分页查询
    Example example = new Example(OrganizationType.class);
    Example.Criteria criteria = example.createCriteria();
    //性别、类型什么的条件先不添加了
    if(StringUtil.isNotEmpty(organizationType.getName())){
        criteria.andLike("name", "%" + organizationType.getName() + "%");
    }
    if(StringUtil.isNotEmpty(organizationType.getDescription())){
        criteria.andLike("description", "%" + organizationType.getDescription() + "%");
    }
    /**
     * 如果需要按照容纳人数搜索加上对应的条件
     */
    List<OrganizationType> organizationTypelist =  organizationTypeDao.selectByExample(example);
    return organizationTypelist;
}
0