SpringBoot整合SpringDatamongodb评论信息储存数据库亲测可行

第一部分:先简单说明一下为什么选择mongodb

1:MongoDB:是一个数据库 ,高性能、无模式、文档性,目前nosql中最热门的数据库,开源产品,基于c++开发。是nosql数据库中功能最丰富,最像关系数据库的。
2:他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
3:对比事务安全,MongoDB更关注高的插入速度。如果你需要加载大量低价值的业务数据,那么MongoDB将很适合你的用例。
4:数据库扩展是非常有挑战性的,当单表格大小达到5-10GB时,MySQL表格性能会毫无疑问的降低。如果你需要分片并且分割你的数据库,MongoDB将很容易实现这一点。
5:MongoDB支持二维空间索引,因此比起关系型数据库而言可以快速及精确的从指定位置获取数据。
简而言之,博主的理解就是当数据量特别大的时候mongodb在数据的读取和插入都会比mysql这些更快更稳定。

第二部分:什么是SpringDatamongodb

1:SpringDataMongoDB是Spring Data的一个子项目,用来封装对MongoDB的操作.SpringDataMongoDB的关键功能领域是一个以POJO为中心的模型,用于与MongoDBCollection交互并轻松编写Repository样式的数据访问层。
简而言之博主的理解就是SpringData将mongodb这个非关系型数据库封装了,以便于更方便的应用在Spring应用中,就像SpringDatajpa那样让所有的spring家族项目对于数据库的操作都变成一样,方便使用,下面会讲怎么使用。

第三部分SpringBoot如何整合SpringDatamongdb

1:第一步将最新的SpringDatamongdb的依赖写入pom文件


    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-mongodbartifactId>
    dependency>

这样idea会自动导入相应的jar包,然后就可以调用相应的方法实现数据操作了
2:第二步在navicat premium (会收费,但是总有方法对吧)中创建monggo集合(就是表)对了安装mongdb网上教程很多,这里就不介绍了。
这是博主创建的评论表,已经存了一些数据
comment这是博主创建评论集合(就是表)已经存了一些数据。
第三步:在你的项目文件的application.yml文件中加上连接数据库的语句

spring:
  application:
    name: ziwang-comment//这个是这个微服务的唯一指定名
    
  data:
    mongodb:
      host: 47.101.39.237//因为博主的mongodb是搭建在阿里云上的所以这里是阿里云上的ip地址,本地的就是location那一套和关系型数据库一样
      port: 27017//端口不用解释吧
      database: zw-conment//这里是数据库名不是表明

第四步:好啦接下来就开始写代码了,先看下项目结构吧
SpringBoot整合SpringDatamongodb评论信息储存数据库亲测可行_第1张图片

  • 关于controller层就是整个项目的控制层,前端发出请求的时候也是这里最先接收到请求做出相应响应
    博主写了增删查改一套方法,会用到什么就自己调用就好了
package com.ziwang.comment.controller;

import com.ziwang.comment.pojo.Comment;
import com.ziwang.comment.service.CommentService;

import entity.Result;
import entity.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@CrossOrigin
@RequestMapping("/comment")
public class CommentController {
    @Autowired
    private CommentService commentService;

    @GetMapping("/findAll")
    public Result findAll(){
        return new Result(true, StatusCode.OK,"查询成功",commentService.findAll());
    }

    @GetMapping (value = "/find/{sid}")
    public List<Map<String, Object>> findById(@PathVariable String sid) {
        System.out.println("查询评论");
        return commentService.findBySid(sid) ;
    }

    @PostMapping("/save/{sid}")
    public Result save(@RequestBody Comment comment,@PathVariable String sid){
        commentService.save(comment,sid);
        return  new Result(true,StatusCode.OK,"保存成功");
    }
    @RequestMapping(value = "/{commentId}",method = RequestMethod.PUT)
    public Result update(@PathVariable String commentId,@RequestBody Comment comment){
        comment.set_id(commentId);
        commentService.updata(comment);
        return  new Result(true,StatusCode.OK,"修改成功");
    }
    @RequestMapping(value = "/{commentId}",method = RequestMethod.DELETE)
    public Result delete(@PathVariable String commentId){
        commentService.deleteById(commentId);
        return  new Result(true,StatusCode.OK,"删除成功");
    }

}

  • service层就是处理事务逻辑的,你可以看到controller层方法里调用的都是service层的方法,不然你将所有方法都写在controller层里面代码就变得非常杂乱了,不好后期维护。
  • 这里我主要写了查询和保存方法
package com.ziwang.comment.service;

import com.ziwang.comment.dao.CommentRepository;
import com.ziwang.comment.pojo.Comment;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import util.IdWorker;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Transactional
public class CommentService {
    @Autowired
    private CommentRepository commentRepository;
    @Autowired
    private IdWorker idWorker;

    /**
     *        
     * * 查询全部记录       
     * * @return     
     */
    public List<Comment> findAll() {
        return commentRepository.findAll();
    }

    /**
     * 根据主键查询实体
     *
     * @return
     */
    public List<Map<String, Object>> findBySid(String sid) {
        List<Map<String, Object>> result = new ArrayList<>();
        List<Comment> comments = commentRepository.findBySid(sid);
        comments.forEach(comment -> {
            Map<String, Object> map = new HashMap<>();
           map.put("comment",comment.getContent());

           map.put("time",comment.getPublishtime());
           result.add(map);
        });
        return result;
    }

    public void save(Comment comment,String sid) {
        SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        comment.setPublishtime(bartDateFormat.format(date));
        comment.set_id(idWorker.nextId() + "");
        comment.setThumbup(0);
        System.out.println(sid);
        comment.setSid(sid);
        commentRepository.save(comment);
    }

    public void updata(Comment comment) {
        commentRepository.save(comment);
    }

    public void deleteById(String id) {
        commentRepository.deleteById(id);

    }
}

  • dao层这里就是写了一个接口,这个接口集成了spring封装了mongodb后的方法,也就是后面调用这个方法就可以直接使用mongdb了。
package com.ziwang.comment.dao;


import com.ziwang.comment.pojo.Comment;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface CommentRepository extends MongoRepository<Comment,String> {


    List<Comment> findBySid(String sid);//这个接口可以不用写方法,他自己有很多常规的方法,但有些不能满足使用要求就要自己写了。
    }



  • 最后就是pojo层了就是实体层,写了一个comment实体类这样要和数据库里定义的字段一一对应,数据类型也要一样。有了这个类操作数据就变得方便许多了
package com.ziwang.comment.pojo;


import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.annotation.Id;

import java.io.Serializable;

public class Comment implements Serializable {

    @Id
    private String _id;
    private String sid;
    private String content;//评论内容

//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String publishtime;//评论时间
    private String userid;
    private String nickname;//评论人
    private Integer thumbup;//点赞数
    private String comment;//回复
    private String parentid;//父级id

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getPublishtime() {
        return publishtime;
    }

    public void setPublishtime(String publishtime) {
        this.publishtime = publishtime;
    }

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Integer getThumbup() {
        return thumbup;
    }

    public void setThumbup(Integer thumbup) {
        this.thumbup = thumbup;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getParentid() {
        return parentid;
    }

    public void setParentid(String parentid) {
        this.parentid = parentid;
    }
}

  • 最后再加一个启动类就将评论单独做成了一个微服务了。
package com.ziwang.comment;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import util.IdWorker;

@EnableFeignClients
@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class CommentApplication {
    public static void main(String[] args) {
        SpringApplication.run(CommentApplication.class,args);
    }

    @Bean//这里是我其他模块里的方法主要是雪花算法生成id的。需要你在依赖里面加入那个模块的依赖。这里也需要放在启动类里面加一个@Bean注解。
    public IdWorker idWorker(){
        return new IdWorker(1, 1);
    }
}

ok完成了,接下来就需要你们去写前端页面了。前后端交互博主用的ajax。
第一次写博客可能很多地方不是还能熟练,会慢慢进步啦

你可能感兴趣的:(SpringBoot)