spring boot MongoRepository实现增删改查

上一篇文章中讲到了基本用法,这次我们详细的讲一下

首先我们要对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出来用就行。

好 上面就是咱们的分页排序查询。

感谢这篇博客的支持点击这里

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值