SpringDataMongoDB的常見的CRUD

我們常用的數據庫一般是MySql,但是在數據量大的時候。MongoDB這種NoSql型數據庫更加有優勢!我們來看一下如何用java來操作。

1、創建一個maven工程引入依賴

別跟我說你不知道到maven是個啥,哈哈哈!!!

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> 
    </parent>

    <groupId>com.mongo</groupId>
    <artifactId>spring_data_mongodb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring_data_mongodb</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
        </dependency>
    </dependencies>
</project>

第一個是springboot集成junit5單元測試的依賴。

第二個就是我們spring爲我們封裝好的框架。

第三個是lombok。可以看一下我以前的文章有介紹。

2、配置數據庫信息

spring:
  data:
    mongodb:
      uri: mongodb://bobo:[email protected]:27017/article

3、定義實體類

package com.mongo.spring_data_mongodb.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 把一個java類聲明爲mongodb的文檔,可以通過collection參數指定這個類對應的文檔。
 * /@Document(collection="mongodb 對應 collection 名")
 * 若未加 @Document ,該 bean save 到 mongo 的 comment collection
 * 若添加 @Document ,則 save 到 comment collection
 * 可以省略,如果省略,則默認使用類名小寫映射集合
 * 複合索引:@CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
 */
@Data
@Document(collection="comment")
public class Comment implements Serializable {

    /**
     * 主鍵標識,該屬性的值會自動對應mongodb的主鍵字段"_id",如果該屬性名就叫“id”,則該註解可以省略,否則必須寫 @Id
     */
    @Id
    private String id;

    private String articleid;
    private String content;

    @Indexed
    private String userid;
    private String nickname;
    private LocalDateTime createdatetime;
    private LocalDate publishtime;
    private Integer likenum;
    private Integer replynum;
    private String state;
    private String parentid;
}

3、dao層,操作數據庫

package com.mongo.spring_data_mongodb.dao;

import com.mongo.spring_data_mongodb.entity.Comment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

/**
 * Mongodb的dao層
 **/
public interface CommentRepository extends MongoRepository<Comment,String> {

    /**
     * 根據條件查詢出分頁
     * @param parentid 父級id
     * @param pageable 分頁
     * @return
     */
    Page<Comment> findByParentid(String parentid, Pageable pageable);

}

這東西就很優秀了,有點像jpa。不需要我們寫一些Mongodb的命令,直接提供好給我們的查詢。有的需要定義,有的基礎的可以直接用。來看一下框架爲我們提供了哪些方法?

@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

	@Override
	<S extends T> List<S> saveAll(Iterable<S> entities);

	@Override
	List<T> findAll();

	@Override
	List<T> findAll(Sort sort);

	<S extends T> S insert(S entity);

	<S extends T> List<S> insert(Iterable<S> entities);

	@Override
	<S extends T> List<S> findAll(Example<S> example);

	@Override
	<S extends T> List<S> findAll(Example<S> example, Sort sort);
}

除此之外我們還可以自己定義方法,就像findByParentid一樣,根據某一個條件查詢。

4、看一下service層,爲我們提供了哪些dao層的方法

package com.mongo.spring_data_mongodb.service;

import com.mongo.spring_data_mongodb.dao.CommentRepository;
import com.mongo.spring_data_mongodb.entity.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
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 java.util.List;

/**
 * Mongodb查詢的業務層
 **/
@Service
public class CommentService {

    @Autowired
    private CommentRepository commentRepository;
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 保存一個數據
     */
    public void saveComment(Comment comment) {
        commentRepository.save(comment);
    }

    /**
     * 更新數據
     */
    public void updateComment(Comment comment) {
        commentRepository.save(comment);
    }

    /**
     * 刪除一個數據
     */
    public void deleteComment(String id) {
        commentRepository.deleteById(id);
    }

    /**
     * 查詢出所有的評論
     */
    public List<Comment> findCommentList() {
        return commentRepository.findAll();
    }

    /**
     * 根據id查詢出評論
     */
    public Comment findCommentById(String id) {
        return commentRepository.findById(id).get();
    }

    /**
     * 查詢分頁
     * @param parentid 父級id
     * @param page 頁數
     * @param size 每頁大小
     * @return
     */
    public Page<Comment> findCommentListPageByParentid(String parentid, int page, int size) {
        return commentRepository.findByParentid(parentid, PageRequest.of(page - 1, size));
    }
    
    /**
     * 使用MongoTemplate來更新
     */
    public void updateCommentLikenum(String id){
        //查詢
        Query query = Query.query(Criteria.where("_id").is(id));
        //更新
        Update update = new Update();
        update.inc("likenum");
        mongoTemplate.updateFirst(query,update,"comment");
    }
}

5、使用MongoTemplate查詢

不多解釋了,自己看一下注釋就行了。

package com.mongo.spring_data_mongodb.service;

import com.mongo.spring_data_mongodb.entity.Comment;
import org.springframework.beans.factory.annotation.Autowired;
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;

/**
 * @ClassName CommentTempalteService
 * @Description
 * @Author 戴書博
 * @Date 2020/5/18 22:48
 * @Version 1.0
 **/
@Service
public class CommentTempalteService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 插入
     */
    public void insertComment(Comment comment) {
        mongoTemplate.insert(comment, "comment");
    }

    /**
     * save的形式在首次插入的時候和insert效果一樣
     * 具有插入和更新的功能
     */
    public void saveComment(Comment comment) {
        mongoTemplate.save(comment, "comment");
    }

    /**
     * save-update更新
     */
    public void updateComment(String name) {
        Comment comment = mongoTemplate.findOne(Query.query(Criteria.where("nickname").is(name)), Comment.class);
        comment.setReplynum(100);
        mongoTemplate.save(comment);
    }

    /**
     * 更新查到的第一個數據
     */
    public void updateFirstComment(String name) {
        Query query = Query.query(Criteria.where("nickname").is(name));
        Update update = new Update();
        update.set("likenum", 1000);
        mongoTemplate.updateFirst(query, update, Comment.class);
    }

    /**
     * 更新查到的所有數據
     */
    public void updateMultiComment(String name) {
        Query query = Query.query(Criteria.where("nickname").is(name));
        Update update = new Update();
        update.set("likenum", 1000);
        mongoTemplate.updateMulti(query, update, Comment.class);
    }

    /**
     * 這個方法其實和上一條類似,只是在更新後會把更新後的內容返回
     * 跟新第一個數據
     */
    public Comment findAndModifyComment(String name) {
        Query query = Query.query(Criteria.where("nickname").is(name));
        Update update = new Update();
        update.set("likenum", 100000);
        return mongoTemplate.findAndModify(query, update, Comment.class);
    }

    /**
     * 刪除
     */
    public void removeComment(String name) {
        Query query = Query.query(Criteria.where("nickname").is(name));
        mongoTemplate.remove(query, Comment.class);
    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章