我在springboot项目种使用的mybatis-plus版本是3.2.0,这个版本可能比较老旧,这个是和项目springboot版本配套的,我采用了默认,没有额外配置它的最新版本。

    3.2.0配置分页插件,没有如今网上很多的那种PaginationInnerInterceptor拦截器,我的只有PaginationInterceptor。不过,好在这个配置也非常简单,只需要配置一个Bean就好了。

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

    这个配置极其简单。但是它能生效。

    剩余的就是怎么对接sql。

    我的需求是普通的分页查询,只能针对一个实体,如果这个实体关联了其他实体对象,同时我们还需要查询出关联对象的属性,那就必须自定义sql了,这个自定义的sql就涉及到怎么和默认的分页产生关联。

    也无需再定义个Page对象,分页传参的时候就使用默认的Page对象。

    最主要的是在Mapper这里如何传参。因为分页参数需要传递给sql语句,所以page,size需要封装在Page参数里。直接看示例:

 CourseMapper.java

@Mapper
public interface CourseMapper extends BaseMapper<Course> {
    Page<CourseResult> selectByPage(@Param("page") Page<CourseResult> page);
}

 CourseMapper.xml

<select id="selectByPage" resultType="com.dronemaster.vo.CourseResult">
         select 
          c.*,o.id 'orgInfo.id',o.name 'orgInfo.name',o.logo 'orgInfo.logo'
         from 
         xx_course as c
         join 
         xx_organization as o
         on c.user_id = o.user_id
</select>

  分页查询语句和普通的列表查询没有什么区别,也没有添加limit,因为前面配置了分页插件拦截器,拦截器会默认帮我们加上。

   这样设置之后,我们的分页和原来没有太大改变,甚至controller都不用大改动,除了返回类型改变,原来是单一的实体对象,这里是一个封装继承的新实体(原实体与关联实体组合体)。

   原来service层不用添加任何代码,不过现在这里需要新增一个方法,就是调用Mapper接口新的分页查询。

@Override
public Page<CourseResult> selectByPage(Page pager) {
     Page<CourseResult> records = courseMapper.selectByPage(pager);
     return records;
}

简易的controller

@ApiOperation("分页查询列表")
@GetMapping("/page")
public ResultData page(@RequestParam(name = "page",defaultValue = "0") int page,@RequestParam(name = "size",defaultValue = "10") int size) {
      Page<CourseResult> pager = new Page<>(page,size);
      Page<CourseResult> res = courseService.selectByPage(pager);
      return ResultData.success(res);
}

   测试结果:

    sql语句这里,分页需要查询总条数,这里它根据我的查询列表语句,自己改变作count(1)查询。

   

    查询列表的分页语句,因为拦截器起作用了,直接在末尾添加了limit分页参数。

    分页结果组装了page对象,另外,我在SQL语句里面把关联的organization对象通过别名的方式定义为orgInfo.id,orgInfo.name,orgInfo.logo。最终返回的时候,它自动给我封装对象了。都不用手动添加。

返回对象封装体:

public class CourseResult extends Course {
    private Organization orgInfo;

    public Organization getOrgInfo() {
        return orgInfo;
    }

    public void setOrgInfo(Organization orgInfo) {
        this.orgInfo = orgInfo;
    }

    public CourseResult() {
    }
}

    在没有尝试之前,我还担心要不要升级mybatis-plus,没想到结果还是很顺利的。尤其是插件配置,非常简单。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐