上一篇文章中讲到了基本用法,这次我们详细的讲一下
首先我们要对MongoRepository有一个基本的了解
他是有一些自己的查询方法的 也支持自定义方法查询
比如 findAll save delete等方法都是自带的方法,如果我们想根据表中的某个属性来查我们就自定义方法就行,方法名字如下
用find+By+属性来查询 如果是模糊查询 就是属性Like;
例如:
public GoodsModel findByName(String name);
public List<GoodsModel> findByNameLike(String name);
一、实现列表条件查询并分页
我这里的场景是根据以下条件查询
所以在查询时 我需要定义两个参数 名字name和 上架状态status ,名字这里咱们用模糊查询,首先我们在dao层定义好查询方法,多个字段差的话用And连接
package com.dao;
import com.model.GoodsModel;
import com.utils.Pagenation;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
/**
* @Auther: Xu
* @Date: 2021/4/6 - 04 - 06 - 16:16
* @Description: com.dao
* @version: 1.0
*/
public interface Commondao extends MongoRepository<GoodsModel,String> {
public List<GoodsModel> findByNameLikeAndStatus(String name,int status);
}
然后在我们的dao service层定义好我们的查询方法
package com.dao;
import com.model.GoodsModel;
import com.utils.Pagenation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Auther: Xu
* @Date: 2021/4/6 - 04 - 06 - 16:18
* @Description: com.dao
* @version: 1.0
*/
@Service
public class GoodsService {
@Autowired
private Commondao commondao;
/**
* 查询
* 注意 个方法名是可以随便起的,但是最好是见明知意
*/
public List findByNameLikeAndStatus(String name,int status){
List<GoodsModel> list = commondao.findByNameLikeAndStatus(name,status);
return list;
}
}
接下来我们就可以在controller层来调用service的这个方法了
@RestController
public class GoodsTools {
@Autowired
private GoodsService goodsService;
//根据商品名字 和上下架状态来查询
@GetMapping(value = "/getGoodsList")
public RespData getGoods(@RequestParam(required = false) String name,
@RequestParam(required = false) String status) throws Exception{
//创建响应体
RespData respData = new RespData(RespCode.SUCCESS);
List<GoodsModel> list = new ArrayList<>();
list = goodsService.findByNameLikeAndStatus(name,status);
respData.setData(list);
return respData;
}
}
上面我们实现了根据名字和状态来查询列表 那么分页怎么做呢?
我们按住ctrl 鼠标点击下面MongoRepository这个类
然后发现它继承了这个东西,我们再按住ctrl点进去PagingAndSortingRepository
这里就两个方法,见明知意 这个就是page和sort
发现分页查询的时候 需要Pageable这个类型的参数,看来这个工具已经帮我们做好了分页查询的功能,我们只需要拿过来用就行了
Pageable 当我们创建pageable这个对象的时候发现不对,它是个interface,所以我们来创建一个Pagenation类 用来继承这个接口,进而来实现他里面的方法供我们用就行。
在公共方法包里面创建一个Pagenation类
package com.utils;
import lombok.Data;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Pageable;
import java.io.Serializable;
/**
* @Auther: Xu
* @Date: 2021/4/7 - 04 - 07 - 20:47
* @Description: com.utils
* @version: 1.0
*/
@Data
public class Pagenation implements Serializable, Pageable{
private static final long serialVersionUID = 1L;
// 当前页
private int pagenumber = 1;
// 当前页面条数
private int pagesize = 10;
//排序条件
private Sort sort;
public void setSort(Sort sort) {
this.sort = sort;
}
public Pagenation() {
super();
}
@Override
public int getPageNumber() {
return this.pagenumber;
}
@Override
public int getPageSize() {
return this.pagesize;
}
/**
* 第二页所需要增加的数量
*/
@Override
public int getOffset() {
return this.pagenumber * this.pagesize;
}
@Override
public Sort getSort() {
return this.sort;
}
@Override
public Pageable next() {
return null;
}
@Override
public Pageable previousOrFirst() {
return null;
}
@Override
public Pageable first() {
return null;
}
@Override
public boolean hasPrevious() {
return false;
}
}
具体接口中的方法大家可以查阅了解一下功能,这里特别注意一下,getOffset这个方法,这是计算下一页数据从哪里结束的,不要忘了写,否则分页无效。
定义好类之后我们修改上面的dao,注意这里引入了两个包类一个是Page 一个是Pageable。
package com.dao;
import com.model.GoodsModel;
import com.utils.Pagenation;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
/**
* @Auther: Xu
* @Date: 2021/4/6 - 04 - 06 - 16:16
* @Description: com.dao
* @version: 1.0
*/
public interface Commondao extends MongoRepository<GoodsModel,String> {
public Page<GoodsModel> findByNameLikeAndStatus(String name,int status,Pageable pageable);
}
继续修改service层
@RestController
public class GoodsTools {
@Autowired
private GoodsService goodsService;
//根据商品名字 和上下架状态来分页查询
@GetMapping(value = "/getGoodsList")
public RespData getGoods(@RequestParam(required = false) String name,
@RequestParam(required = false) String status,
@RequestParam(required = false) int pageNum,
@RequestParam(required = false) int pageSize
) throws Exception{
//创建响应体
RespData respData = new RespData(RespCode.SUCCESS);
List<GoodsModel> list = new ArrayList<>();
Pagenation pagenation = new Pagenation();
//每页显示条数
pagenation.setPagesize(pageSize);
//当前页
pagenation.setPagenumber(pageNum-1);
//根据创建时间排序
Sort sort = new Sort(Sort.Direction.DESC, "cTime");
pagenation.setSort(sort);
Page<GoodsModel> page = goodsService.findByNameLikeAndStatus(name,status,pagenation);
list = page.getContent();
respData.setData(list);
return respData;
}
}
需要注意的是上面dao层查询方法返回的是一个page对象 这个对象里面content的值才是咱们要的list 所以取出来就行,如果需要总条数,page对象身上还有个属性叫他,直接get出来用就行。
好 上面就是咱们的分页排序查询。
感谢这篇博客的支持点击这里