Spring Boot中整合MongoDB

MongoDB介绍

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB的特点

1、MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
2、Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
3、MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
4、Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
5、Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
6、Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
7、GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
8、MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
9、MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
10MongoDB安装简单。

下面来说说在spring boot中整合MongoDB的例子

创建项目

创建项目时,添加web以及spring data mongodb、spring security依赖
在这里插入图片描述

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
</dependency>

MongoDB的配置

spring.data.mongodb.authentication-database=admin  #mongo默认的一个admin库
spring.data.mongodb.database=zhouym  #随便起一个name
spring.data.mongodb.host=10.0.0.13  #mongodb的ip
spring.data.mongodb.port=27017   #mongodb的默认端口
spring.data.mongodb.username=zhouym  #mongodb的用户名
spring.data.mongodb.password=123  #mongodb的密码

MongoDB的使用

创建一个book类

package com.zhouym.mongodb;

/**
 * 〈〉
 *
 * @author zhouym
 * @create 2019/8/28
 * @since 1.0.0
 */
public class Book {
    private Integer id;
    private String name;
    private String auth;

    public Book() {
    }

    public Book(Integer id, String name, String auth) {
        this.id = id;
        this.name = name;
        this.auth = auth;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuth() {
        return auth;
    }

    public void setAuth(String auth) {
        this.auth = auth;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", auth='" + auth + '\'' +
                '}';
    }
}

创建一个接口类,并继承MongoRepository

package com.zhouym.mongodb;

import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface MongoDbBook extends MongoRepository<Book,Integer> {
 
}

来看看这个MongoRepository类的源码

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.mongodb.repository;

import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    <S extends T> List<S> saveAll(Iterable<S> var1);

    List<T> findAll();

    List<T> findAll(Sort var1);

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

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

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

可以看到有点类似于Jpatemplate那一套东西,里面对应封装了插入、查找的方法
我们在测试类中测试

package com.zhouym.mongodb;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
    @Autowired
    MongoDbBook mongoDbBook;

    @Test
    public void contextLoads() {
        Book book = new Book();
        book.setId(2);
        book.setName("西游记");
        book.setAuth("吴承恩");
        mongoDbBook.insert(book);
    }

}

在这里插入图片描述
测试获取数据

package com.zhouym.mongodb;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
    @Autowired
    MongoDbBook mongoDbBook;

    @Test
    public void test(){
        List<Book> books = mongoDbBook.findAll();
        System.out.println(books);
    }

}

在这里插入图片描述
在MongoRepository源码中我们发现方法的参数是对象,那么如果我想通过一个name进行查找呢,也是可以的,需要我们在自定义的接口类中定义方法
在这里插入图片描述
如下,定义了一个根据name查找的方法

package com.zhouym.mongodb;

import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface MongoDbBook extends MongoRepository<Book,Integer> {
    List<Book> findBookByNameContaining(String name);

}

我们在测试类中测试看看

package com.zhouym.mongodb;

        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.boot.test.context.SpringBootTest;
        import org.springframework.data.mongodb.core.MongoTemplate;
        import org.springframework.test.context.junit4.SpringRunner;

        import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
    @Autowired
    MongoDbBook mongoDbBook;

    @Test
    public void test1(){
        List<Book> books = mongoDbBook.findAll();
        System.out.println(books);
        List<Book> book = mongoDbBook.findBookByNameContaining("西");
        System.out.println(book);
    }

}

在这里插入图片描述
还有一种方式,可以使用MongoTemplate模板类,跟前面的用法差不多
在这里插入图片描述

package com.zhouym.mongodb;

        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.boot.test.context.SpringBootTest;
        import org.springframework.data.mongodb.core.MongoTemplate;
        import org.springframework.test.context.junit4.SpringRunner;

        import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
  
    @Autowired
    MongoTemplate mongoTemplate;

    @Test
    public void test2(){
        Book book = new Book();
        book.setId(3);
        book.setName("红楼梦");
        book.setAuth("曹雪芹");
        mongoTemplate.insert(book);
        List<Book> books = mongoTemplate.findAll(Book.class);
        System.out.println(books);
    }

}

在这里插入图片描述
在这里插入图片描述

发布了207 篇原创文章 · 获赞 87 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhouym_/article/details/100124494