Mybatis-Plus模糊分页查询及关联查询(全注解实现)⽂章⽬录
Mybatis-Plus分页查询
Mybatis-Plus分页插件解读
1. 引⼊依赖
<!-- mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
3. 引⼊分页插件(官⽅推荐的最新引⼊⽅式):
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//DbType 数据库类型
PaginationInnerInterceptor page =new PaginationInnerInterceptor(DbType.MYSQL);
//单次查询最⼤的数量如果我查10条,返回还是5条。
page.setMaxLimit(5L);
//溢出总页数后是否做处理(默认不做,true表⽰做处理,回到⾸页) false 继续请求
page.setOverflow(false);
MybatisPlusInterceptor interceptor =new MybatisPlusInterceptor();
//设置数据库类型为mysql
interceptor.addInnerInterceptor(page);
return interceptor;
}
PaginationInnerInterceptor :⾃动分页插件
属性:
常⽤的数据库类型sql等,详细请见官⽅⽂档。
MybatisPlusInterceptor:MP插件主体,addInnerInterceptor返回值为Interceptor接⼝,mybatis的其他插件都是其实现类。
通过他们的命名我们可知,他们都是⼀些
分页查询条件准备
分页查询5要素
分页查询的条件
current:当前页
size:当前页显⽰数据条数
records:返回数据
total:数据库数据总量
pages:总页数
当然,也缺少不了数据的排序⽅式。
MP提供的分页条件类
Page
IPage接⼝
Page实现了IPage接⼝
通过这两个默认⽅法我们可知,查询时,如果当前页数<=1,那么默认从第0页开始查,如果>=1,则从传⼊页数-1开始查。
⾃定义的分页条件类
虽然MP给我们提供了丰富的分页查询接⼝,但是由于功能过于繁多,正常开发中我们很少⽤到,所以适合我们的才是最好的。我这⾥提供了⼀个⾃定义的查询条件接⼝,满⾜⾃⼰作品的使⽤。
在这⾥,我们默认从第⼀页开始查询数据。
并且排序⽅式[{‘column’: ‘create_time’,‘asc’: false},{‘column’: ‘name’,‘asc’: "true}]
默认是按照,创建时间倒序的⽅式[{‘column’: ‘create_time’,‘asc’: false}]
@Data
@ApiModel(value ="分页", description ="orders传参实例:[{'column': 'create_time','asc': false},{'column': 'name','asc': "+ "true}]")
public class PageVO {
/**
* 当前页
*/
@ApiModelProperty(value ="当前页")
private Integer current;
/**
/**
* 当前页显⽰数据的条数
*/
@ApiModelProperty(value ="当前页显⽰数据的条数")
private Integer size;
/**
* 获取排序信息,排序的字段和正反序
*/
@ApiModelProperty(value ="排序⽅式。(默认【创建时间倒序】:[{'column': 'create_time','asc': false}])。",
notes ="例⼦:[{'column': 'create_time','asc': false},{'column':'name','asc': true}]"
)
private String orders;
/**
* 当前页默认值为1
*/
public Integer getCurrent(){
return current =(current ==null|| current <=0)?1: current;
}
/**
* 每页⼤⼩默认为10
*/
public Integer getSize(){
return size =(size ==null|| size ==0)?10: size;
}
public Integer obtainRealCurrent(){
return current;
}
public Integer obtainRealSize(){
return size;
}
/**
* description:将orders(json数组字符串)转为List
* Date: 2020/11/22 16:43
*/
public List<OrderItem>generateOrderList(){
List<OrderItem> orderItemList =new ArrayList<>();
if(StrUtil.isBlank(getOrders())){
orderItemList.add(OrderItem.desc("create_time"));
}else{
try{
orderItemList = JSONArray.parseArray(orders, OrderItem.class);
}catch(Exception e){
throw new BadRequestException("分页排序参数orders不合法,请传正确的参数格式——['column':'','asc':'true/false']");
}
}
return orderItemList;
}
/**
* description:根据pageVO构建分页查询IPage
* @return IPage查询条件
* Date: 2020/11/22 17:19
*/
public<K> IPage<K>buildPage(){
Page<K> page =new Page<>(getCurrent(),getSize());
page.addOrder(generateOrderList());
return page;
}
}
案例⼀:使⽤MP提供的mapper进⾏分页查询
分页查询所有学⽣信息
controller
public Result<Object>getAllStudent(Page studentPage){
IPage<StudentDTO> allStudents = studentService.selectPageStudent(studentPage);
return Result.success(allStudents);
}
service
@Override
public IPage<StudentDTO>selectPageStudent(Page studentIPage){
//设置返回的分页查询结果。由于我们要返回DTO类型的数据,分页查询时,我们只能查Student类型数据,所有我们需要重新封装查询结果 IPage<StudentDTO> returnPage = studentIPage;
IPage<Student> studentPage = studentMapper.selectPage(studentIPage,null);
List<Student> students = Records();
List<StudentDTO> studentsDTO = Dto(students);
returnPage.setRecords(studentsDTO);
return returnPage;
}
returnPage结果:
"data":{
"records":[
{
"id":1,
"name":"张浩琦"
},
{
"id":2,
"name":"张武"
},
{
"id":3,
"name":"花花"
},
{
"id":4,
"name":"花花"
},
{
"id":5,
"name":"花花"
}
],
"total":21,
"size":5,mysql操作官方文档
"current":1,
"orders":[],
"optimizeCountSql":true,
"hitCount":false,
"countId":null,
"maxLimit":null,
"searchCount":true,
"pages":5
案例⼆:使⽤MP提供的mapper进⾏模糊分页查询
分页查询所有的项⽬信息
controller
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论