java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Mybatis-plus 分页查询

SpringBoot+Mybatis-plus实现分页查询的示例代码

作者:2301_81439082

本文主要介绍了SpringBoot+Mybatis-plus实现分页查询的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

分页查询就是实现前端能进行翻页功能实现、查询功能实现等比如

这张图片里面搜索功能和底下翻页的功能、每页展示多少条数据的功能

都是由我们后端返回的参数 total、pages、records等前端接收实现的

意思是这些功能我们后端不仅要实现分页功能,前端接收我们返回的参数也要实现相对应的功能

后端只用返回查询结果和返回的total等字段

那么我们如何实现呢

首先,根据这张图,我们需要几个类 

实体类 ,DTO,以及VO

这几个类来干嘛? DTO就是用来当形参的,VO就是来当返回信息的,实体类干嘛?先别急,听我说

根据这张图片,我们首先要实现对于人员姓名的模糊查询,手机号的查询,以及状态的查询

所以我们是不是就要传三个字段username、phone、status呢

是的,然后我们定义一个dto类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Api(tags = "用户查询列表")
public class QueryUserDto extends PageDto {

    @ApiModelProperty(value = "账号")
    private String account;
    @ApiModelProperty(value = "用户姓名")
    private String accName;
   @ApiModelProperty(value = "手机号")
    private String accPhone;
    @ApiModelProperty(value = "是否启用(1:启用,0:停用)")
    private Integer isEnable;
}

Api这些注解是用的swagger的,相当于是提示功能,这些都先不管,我们是不是定义好了几个需要传入的字段?ok ,那么我们刚刚说了既然是分页功能,是不是要由total、pageSize等字段呢

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Data
@Setter
@ApiModel(value = "分页对象" ,description = "分页查询实体")
@NoArgsConstructor
public class PageDto {
    @ApiModelProperty(value = "页码",required = true)
    private  Integer PageNumber=1;
    @ApiModelProperty(value = "每页显示数量",required = true)
    private  Integer PageSize=10;
    @ApiModelProperty("排序字段")
    private  String sortBy;
    @ApiModelProperty("排序方式")
    private  Boolean isAsc;

}

这个就是我们需要传入的分页对象,可以说是一个查询的模板,大家可以保存下来,要分页的时候拿出来用就行了。我们刚刚定义的QueryUserDto继承这个pageDto,相当于pageDto是一个父类,但我们用的是QueryUserDto,在实际情况中,我们可以通过需要传入哪些字段进行查询来定义我们QueryUserDto里面的字段

然后是返回对象VO,我们刚刚提到前端需要我们返回给他们Total,pages,records等字段,VO里面就封装了这些字段,

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;
@Data
public class PageVO<T> {
   @ApiModelProperty(value = "每页显示的条数")
    private  Long size =10L;
   @ApiModelProperty(value = "当前页")
    private Long current=1L;
   @ApiModelProperty(value = "总条数")
    private Long total;
   @ApiModelProperty(value = "总页数")
    private Long pages;
   @ApiModelProperty(value = "分页数据")
    private List<T> records;
}

这里面就封装了前端需要的字段,每次返回给前端都会默认有这些字段,这也是一个模板,大家可以保存起来

然后就是具体的实现方法,首先就是mybatis-plus的分页插件

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

这个就是mybatis-plus提供的分页插件功能,我们配置好后进入下一步

创建相关的service接口类

里面的方法暂且可以不管,看PageUser这个方法

然后实现类serviceImpl

 @Override
    public R<?> PageUser(QueryUserDto queryUserDto)  {

        Page<AccountInfo> userPage = new Page<>(queryUserDto.getPageNumber(), queryUserDto.getPageSize());

        LambdaQueryWrapper<AccountInfo> queryWrapper =new LambdaQueryWrapper<>();
        if(queryUserDto.getIsEnable()!=null){
            queryWrapper.eq(AccountInfo::getIsEnable,queryUserDto.getIsEnable());
        }

        String accName=queryUserDto.getAccName();
        if (StringUtils.isNotBlank(accName)){
            accName=accName.trim();
            queryWrapper.like(AccountInfo::getAccName,accName);
        }
        String accPhone=queryUserDto.getAccPhone();
        if (StringUtils.isNotBlank(accPhone)){
            accPhone=accPhone.trim();
            queryWrapper.like(AccountInfo::getAccPhone,accPhone);
        }
        String account=queryUserDto.getAccount();
        if (StringUtils.isNotBlank(account)){
            account=account.trim();
            queryWrapper.like(AccountInfo::getAccount,account);
        }


        Page<AccountInfo> page = page(userPage,queryWrapper);

   

        PageVO<AccountInfo> userPageVO = new PageVO<>();
        BeanUtils.copyProperties(page,userPageVO);
        return R.Success("查询成功",userPageVO);
    }

关于形参我在上面讲到过,我们不用pageDto实现,而是用他的子类QueryUserDto来实现,因为是继承关系,所以我们传入他的子类QueryUserDto。

我们看起来这个代码很复杂,其实我们可以分成三个板块看就很清晰结构了

第一个

第二个

这部分代码是通过mybatis-plus中的Lambada来构造查询条件,作用就是人员姓名模糊查询、状态查询、手机号查询,trim()是来设置去除传入参数的空格的,以便前端输入带有空格的数据时查询不出来

第三个

调用page方法,传入分页信息(userPage)和查询条件(queryWrapper),然后返回一个包含查询结果和分页信息的Page<AccountInfo>对象。

然后创建VO对象的实例,通过BeanUtils工具类将查询出来的对象复制给VO对象,这就是VO的作用,用于返回信息

运行效果

总结

首先我们需要引入分页插件配置,然后创建DTO和VO,DTO包含我们需要的进行查询的字段,继承PageDto,VO是返回信息的对象,这样做不会影响我们创建的实体类。

接下来就是service接口和serviceImpl实现类的创建,在实现类里面编写我们分页的逻辑

然后三部分结构,引入Page实例、查询语句编写、page方法进行查询并复制给VO对象用于返回信息 

到此这篇关于SpringBoot+Mybatis-plus实现分页查询的示例代码的文章就介绍到这了,更多相关SpringBoot Mybatis-plus 分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文