常用方法:
日常开发中,分页查询是常见的查询方式,分页查询有几种不同的方式,这里介绍一种我最常用的方法;
首先pom.xml文件中引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
分页配置类
@Configuration
public class MyBatisConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
//新建MybatisPlus拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//新建分页拦截器paginationInnerInterceptor
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
//把分页拦截器添加到MybatisPlus拦截器中
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
//添加组件,大功告成!
return mybatisPlusInterceptor;
}
}
自定义列表返回对象:
@Data
public class PageResult<T> implements Serializable {
private Long total;
private List<T> records;
public PageResult() {
}
public PageResult(Long total, List<?> records) {
this.total = total;
this.records = (List<T>) records;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public List<?> getRecords() {
return records;
}
public void setRecords(List<?> records) {
this.records = (List<T>) records;
}
}
准备就绪开始分页查询(这里介绍单表查询,多表查询需要自己写Sql):
分页查询类:
@Data
@Builder
public class FileQuery {
/**
* 分页参数
*/
private Integer page = 1;
private Integer pageSize = 10;
/**
* 上传类型
*/
@NotBlank(message = "上传类型不能为空", groups = {Update.class, Add.class})
private String uploadType;
/**
* 文件key
*/
@NotBlank(message = "文件key", groups = {Update.class, Add.class})
private String fileKey;
/**
* 文件类型
*/
@NotBlank(message = "文件类型不能为空", groups = {Update.class, Add.class})
private String fileType;
/**
* 文件大小
*/
@NotNull(message = "文件大小不能为空", groups = {Update.class, Add.class})
private Double fileSize;
/**
* 文件原始名
*/
@NotBlank(message = "文件原始名不能为空", groups = {Update.class, Add.class})
private String fileOldName;
/**
* 开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime startTime;
/**
* 结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime endTime;
}
Controller层:
@GetMapping("/page")
public PageResult page(FileQuery query){
log.info("分页查询文件:{}",query);
return fileService.pageQuery(query);
}
Service层:
PageResult pageQuery(FileQuery query);
ServiceImpl实现类:
@Override
public PageResult pageQuery(FileQuery query) {
Page<File> page = new Page<>(query.getPage(), query.getPageSize());
new LambdaQueryChainWrapper<>(fileMapper)
.eq(StringUtils.hasText(query.getUploadType()),File::getUploadType,query.getFileType())
.eq(StringUtils.hasText(query.getFileKey()),File::getFileKey,query.getFileKey())
.eq(StringUtils.hasText(query.getFileType()),File::getFileType,query.getFileType())
.eq(Objects.nonNull(query.getFileSize()),File::getFileSize,query.getFileSize())
.like(StringUtils.hasText(query.getFileOldName()),File::getFileOldName,query.getFileOldName())
.page(page);
long total = page.getTotal();
List<File> records = page.getRecords();
return new PageResult<>(total,records);
}
使用若依框架进行分页查询
若依框架封装了分页工具类,可以直接使用
自定义列表返回对象:
public class TableDataInfo implements Serializable
{
private static final long serialVersionUID = 1L;
/** 总记录数 */
private long total;
/** 列表数据 */
private List<?> rows;
/** 消息状态码 */
private int code;
/** 消息内容 */
private String msg;
/**
* 表格数据对象
*/
public TableDataInfo()
{
}
/**
* 分页
*
* @param list 列表数据
* @param total 总记录数
*/
public TableDataInfo(List<?> list, int total)
{
this.rows = list;
this.total = total;
}
public long getTotal()
{
return total;
}
public void setTotal(long total)
{
this.total = total;
}
public List<?> getRows()
{
return rows;
}
public void setRows(List<?> rows)
{
this.rows = rows;
}
public int getCode()
{
return code;
}
public void setCode(int code)
{
this.code = code;
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this.msg = msg;
}
}
Controller层:
/**
* 列表查询解决方案
*/
@GetMapping("/solutionList")
public TableDataInfo page(OaSolutionQuery query) {
PageHelper.startPage(query.getPageNum(), query.getPageSize());
List<OaSolution> list = oaSolutionService.list(query);
return MyPageUtil.myPageDataInfo(list);
}
Service层:
List<OaSolution> list(OaSolutionQuery query);
ServiceImpl实现类:
@Override
public List<OaSolution> list(OaSolutionQuery query) {
return oaSolutionMapper.list(query);
}
Mapper接口:
List<OaSolution> list(OaSolutionQuery query);
Mapper.xml文件中写Sql语句(我这里是多表查询关联了别的表):
<select id="list" resultType="com.oas.contract.domain.OaSolution">
select os.id,
os.solution_subject as solutionSubject,
os.customer_name as customerName,
os.project_name as projectName,
os.customer_demand_id as customerDemandId,
os.report_type_id as reportTypeId,
os.amount as osAmount
from oa_solution os
left join oas.oa_customer_demand ocd on os.customer_demand_id = ocd.customer_demand_id
left join oas.oa_business_opportunity obo on os.id = obo.project_id
where os.id = #{id}
order by os.create_time desc
</select>