文档型数据库MongoDB-SpringCloud采用SpringDataMongoDB框架操作MongoDB

本文介绍了如何在SpringCloud项目中使用SpringDataMongoDB框架进行MongoDB数据库的操作,包括基本的增删改查,以及根据上级ID查询吐槽列表、点赞功能的实现,并详细阐述了如何通过Redis防止重复点赞以及发布吐槽的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud采用SpringDataMongoDB框架操作MongoDB

pom.xml引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

创建application.yml

server:
  port: 9006
spring:
  application:
    name: tensquare-spit #指定服务名
  data:
    mongodb:
      host: 192.168.2.10
      database: spitdb

创建启动类

package com.tensquare.mongo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import util.IdWorker;

@SpringBootApplication
public class MongoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MongoApplication.class);
    }

    @Bean
    public IdWorker idWorker(){
        return new IdWorker(1, 1);
    }
}

基本增删改查API实现

(1)创建实体类

创建包com.tensquare.spit,包下建包pojo 用于存放实体类,创建实体类

package com.tensquare.mongo.pojo;

import org.springframework.data.annotation.Id;

import java.io.Serializable;
import java.util.Date;

public class Spit implements Serializable {

    @Id
    private String _id;
    private String content;
    private Date publishtime;
    private String userid;
    private String nickname;
    private Integer visits;
    private Integer thumbup;
    private Integer share;
    private Integer comment;
    private String state;
    private String parentid;
	
	......
}

(2)创建数据访问接口

com.tensquare.spit包下创建dao包,包下创建接口

package com.tensquare.mongo.dao;

import com.tensquare.mongo.pojo.Spit;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface SpitDao extends MongoRepository<Spit, String> {
    public Page<Spit> findByParentid(String parentid, Pageable pageable);
}

(3)创建业务逻辑类

com.tensquare.spit包下创建service包,包下创建类

package com.tensquare.mongo.service;

import com.tensquare.mongo.dao.SpitDao;
import com.tensquare.mongo.pojo.Spit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import util.IdWorker;

import java.util.Date;
import java.util.List;

@Service
public class SpitService {
    @Autowired
    private SpitDao spitDao;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private MongoTemplate mongoTemplate;

    public List<Spit> findAll(){
        return spitDao.findAll();
    }

    public Spit findById(String id){
        return spitDao.findById(id).get();
    }

    public void save(Spit spit){
        spit.set_id(idWorker.nextId()+"");
        //初始化数据完善
        spit.setPublishtime(new Date());//发布日期
        spit.setVisits(0);//浏览量
        spit.setShare(0);//分享数
        spit.setThumbup(0);//点赞数
        spit.setComment(0);//回复数
        spit.setState("1");//状态
        //判断当前吐槽是否有父节点
        if(spit.getParentid()!=null && !"".equals(spit.getParentid())){
            //给父节点吐槽的回复数加一
            Query query = new Query();
            query.addCriteria(Criteria.where("_id").is(spit.getParentid()));
            Update update = new Update();
            update.inc("comment", 1);
            mongoTemplate.updateFirst(query, update, "spit");
        }
        spitDao.save(spit);
    }

    public void update(Spit spit){
        spitDao.save(spit);
    }

    public void deleteById(String id){
        spitDao.deleteById(id);
    }


    public Page<Spit> pageQuery(String parentid, int page, int size){
        Pageable pageable = PageRequest.of(page-1, size);
        return spitDao.findByParentid(parentid, pageable);
    }

    //db.spit.update({_id:"2"},{$inc:{visits:NumberInt(1)}} )
    public void addthumbup(String id){
        //方式一
//        Spit spit = spitDao.findById(id).get();
//        spit.setThumbup(spit.getThumbup()+1);
//        spitDao.save(spit);

        //存储过程和存储函数的优势?
        //存储过程相当于把业务逻辑写到数据库端。
        //加入java端有一个业务逻辑需要十次数据库操作,
        //那么我们正常来说就需要链接数据库十次
        //链接数据库频繁就意味要牺牲效率。
        //如果用存储过程把业务逻辑写到数据库端
        //只需要链接一次数据库就可以完成十步操作
        //默认情况下存储过程无法并发,但是可以优化。
        //而且存储过程和存储函数使用的编程语言是pl/sql是面向过程的。维护起来特别麻烦。
        //方式二
        //封装的是查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        //封装修改的数据内容
        Update update = new Update();
        update.inc("thumbup", 1);
        mongoTemplate.updateFirst(query, update, "spit");
    }
}

(4)com.tensquare.spit包下创建controller类

package com.tensquare.mongo.controller;

import com.tensquare.mongo.pojo.Spit;
import com.tensquare.mongo.service.SpitService;
import entity.PageResult;
import entity.Result;
import entity.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/spit")
@CrossOrigin
public class SpitController {

    @Autowired
    private SpitService spitService;
    @Autowired
    private RedisTemplate redisTemplate;

    @RequestMapping(method = RequestMethod.GET)
    public Result findAll(){
        return new Result(true, StatusCode.OK, "查询成功", spitService.findAll());
    }

    @RequestMapping(value = "/{spitId}", method = RequestMethod.GET)
    public Result findById(@PathVariable String spitId){
        return new Result(true, StatusCode.OK, "查询成功", spitService.findById(spitId));
    }

    @RequestMapping(method = RequestMethod.POST)
    public Result save(@RequestBody Spit spit){
        spitService.save(spit);
        return new Result(true, StatusCode.OK, "添加成功");
    }

    @RequestMapping(value = "/{spitId}", method = RequestMethod.PUT)
    public Result update(@PathVariable String spitId, @RequestBody Spit spit){
        spit.set_id(spitId);
        spitService.update(spit);
        return new Result(true, StatusCode.OK, "修改成功");
    }


    @RequestMapping(value = "/{spitId}", method = RequestMethod.DELETE)
    public Result delete(@PathVariable String spitId){
        spitService.deleteById(spitId);
        return new Result(true, StatusCode.OK, "删除成功");
    }

    @RequestMapping(value = "/comment/{parentid}/{page}/{size}", method = RequestMethod.GET)
    public Result comment(@PathVariable String parentid, @PathVariable int page, @PathVariable int size){
        Page<Spit> pageData = spitService.pageQuery(parentid, page, size);
        return new Result(true, StatusCode.OK, "查询成功", new PageResult<Spit>(pageData.getTotalElements(), pageData.getContent()));
    }

    @RequestMapping(value = "/thumbup/{spitId}", method = RequestMethod.PUT)
    public Result addthumbup(@PathVariable String spitId){
        String userid = "11111";
        //先判断该用户是否已经点赞了。
        if(redisTemplate.opsForValue().get("spit_"+userid+"_"+spitId)!=null){
            return new Result(false, StatusCode.REPERROR, "不能重复点赞");
        }
        spitService.addthumbup(spitId);
        redisTemplate.opsForValue().set("spit_"+userid+"_"+spitId, 1);
        return new Result(true, StatusCode.OK, "点赞成功");
    }
}

复杂点的操作

根据上级ID查询吐槽列表

SpitController

    /**
     * 根据上级ID查询吐槽分页数据
     * @param parentId
     * @param page
     * @param size
     * @return
     */
    @RequestMapping(value="/comment/{parentId}/{page}/{size}",method=RequestMethod.GET)
    public Result findByParentid(@PathVariable String parentId, @PathVariable int page, @PathVariable int size){
        Page<Spit> pageList = spitService.findByParentid(parentId,page,size);
        return new Result(true, StatusCode.OK, "查询成功", new PageResult<Spit>(pageList.getTotalElements(), pageList.getContent()));
    }

SpitService

    public Page<Spit> findByParentid(String parentid, int page, int size){
        Pageable pageable = PageRequest.of(page-1, size);
        return spitDao.findByParentid(parentid, pageable);
    }

SpitDao

public interface SpitDao extends MongoRepository<Spit, String> {
    public Page<Spit> findByParentid(String parentid, Pageable pageable);
}

吐槽点赞

我们看一下以下点赞的代码: SpitService 新增updateThumbup方法

    public void addthumbup(String id){
        // 方式一
        Spit spit = spitDao.findById(id).get();
        spit.setThumbup(spit.getThumbup()+1);
        spitDao.save(spit);
    }

以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可以了,没必要查询出所有字段修改后再更新所有字段。
我们可以使用MongoTemplate类来实现对某列的操作。

(1)修改SpitService

    public void addthumbup(String id){
        //存储过程和存储函数的优势?
        //存储过程相当于把业务逻辑写到数据库端。
        //加入java端有一个业务逻辑需要十次数据库操作,
        //那么我们正常来说就需要链接数据库十次
        //链接数据库频繁就意味要牺牲效率。
        //如果用存储过程把业务逻辑写到数据库端
        //只需要链接一次数据库就可以完成十步操作
        //默认情况下存储过程无法并发,但是可以优化。
        //而且存储过程和存储函数使用的编程语言是pl/sql是面向过程的。维护起来特别麻烦。


        //方式二
        //封装的是查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        //封装修改的数据内容
        Update update = new Update();
        update.inc("thumbup", 1);
        mongoTemplate.updateFirst(query, update, "spit");
    }

(2)SpitController新增方法

    @RequestMapping(value = "/thumbup/{spitId}", method = RequestMethod.PUT)
    public Result addthumbup(@PathVariable String spitId){
        spitService.addthumbup(spitId);
        return new Result(true, StatusCode.OK, "点赞成功");
    }

控制不能重复点赞

我们可以通过redis控制用户不能重复点赞

(1)首先引入依赖

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

(2)修改application.yml

server:
  port: 9006
spring:
  application:
    name: tensquare-spit #指定服务名
  data:
    mongodb:
      host: 192.168.2.10
      database: spitdb
  redis:
    host: 192.168.2.10

(3)修改SpitController代码逻辑

    @RequestMapping(value = "/thumbup/{spitId}", method = RequestMethod.PUT)
    public Result addthumbup(@PathVariable String spitId){
        String userid = "11111";
        //先判断该用户是否已经点赞了。
        if(redisTemplate.opsForValue().get("spit_"+userid+"_"+spitId)!=null){
            return new Result(false, StatusCode.REPERROR, "不能重复点赞");
        }
        spitService.addthumbup(spitId);
        redisTemplate.opsForValue().set("spit_"+userid+"_"+spitId, 1);
        return new Result(true, StatusCode.OK, "点赞成功");
    }

发布吐槽

修改SpitService的add方法

    /**
     * 发布吐槽(或吐槽评论)
     * @param spit
     */
    public void add(Spit spit){
        spit.set_id(idWorker.nextId()+"" );
        spit.setPublishtime(new Date());//发布日期
        spit.setVisits(0);//浏览量
        spit.setShare(0);//分享数
        spit.setThumbup(0);//点赞数
        spit.setComment(0);//回复数
        spit.setState("1");//状态
        if(spit.getParentid()!=null && !"".equals(spit.getParentid())){// 如果存在上级ID,评论
            Query query=new Query();
            query.addCriteria(Criteria.where("_id").is(spit.getParentid()));
            Update update=new Update();
            update.inc("comment",1);
            mongoTemplate.updateFirst(query,update,"spit");
        }
        spitDao.save(spit);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值