SpringBoot整合MongoDB实现增删改查

一、MongoDB是什么

1、维基百科

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当***能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

##2、简而言之 MongoDB是文档型的NoSQL数据库,数据以文档(对应关系型数据库的记录)的形式在MongoDB中保存,文档实际上就是一个个JSON字符串,使用JSON的好处是非常直观,通过一系列的Key-Value键值对来表示数据,符合我们的阅读习惯。 在Java、Python中对JSON都有很好的支持,数据从MongoDB中读取出来后,可无需转换直接使用;支持丰富的数据结构,Value可以是普通的整型、字符串、数组、嵌套的子文档,使用嵌套的好处是在MongoDB中仅需一次简单的查询就能够获取到你所需的数据。

二、MongoDB 的应用场景

1、MongoDB事务

MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景。 灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储。

2、多引擎支持各种强大的索引需求

  • 支持地理位置索引
  • 可用于构建各种O2O应用
  • 文本索引解决搜索的需求
  • TTL索引解决历史数据过期的需求
  • Gridfs解决文件存储的需求
  • aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成。

3、具体的应用场景

传统的关系型数据库在解决三高问题上的力不从心。 何为三高?

High performance - 对数据库高并发读写的需求。 Huge Storage - 对海量数据的高效率存储和访问的需求。 High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。 MongoDB可以完美解决三高问题。

4、以下是几个实际的应用案例:

(1)游戏场景 使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。 (2)物流场景 使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。 (3)社交场景 使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。 (4)物联网场景 使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。 (5)视频直播 使用MongoDB存储用户信息、点赞互动信息。

5、选择MongoDB的场景总结:

  • 数据量大
  • 读写操作频繁
  • 数据价值较低,对事务要求不高

三、MongoDB对比MySQL

1、关键字对比

MySQL MongoDB 解释说明
database database 数据库
table collection 表/集合
row document 行/文档
column field 字段/域
index index 索引
join 嵌入文档 表关联/MongoDB不支持join,MongoDB通过嵌入式文档来替代多表连接
primary key primary key 主键/MongoDB自动将_id字段设置为主键

四、SpringBoot整合MongoDB实现增删改查

1、引入pom

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>MongoDBProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <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.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>
</project>

2、启动类Application

package com.guor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

3、实体类

package com.guor.bean;

import org.springframework.data.annotation.Id;

import java.io.Serializable;

public class User implements Serializable {
    @Id
    private String id;//主键
    //该属性对应mongodb的字段的名字,如果一致,则无需该注解
    private String name;
    private Integer age;
    private String phone;
    private String parentid;//上级ID

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getParentid() {
        return parentid;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", phone='" + phone + '\'' +
                ", parentid='" + parentid + '\'' +
                '}';
    }
}

4、UserRepository

package com.guor.dao;

import com.guor.bean.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User,String> {
    Page<User> getPageByid(String parentId, Pageable pageable);
}

5、业务层service

package com.guor.service;

import com.guor.bean.User; import com.guor.dao.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service;

import java.util.List;

@Service public class UserService {

@Autowired
private UserRepository userRepository;

public void insertUser(User user){
    userRepository.save(user);
}

public void updateUser(User user){
    userRepository.save(user);
}

public void deleteUserById(String id){
    userRepository.deleteById(id);
}

public List<User> getAllUser(){
    return userRepository.findAll();
}

/**
 * 根据id查询评论
 */
public User getUserById(String id){
    return userRepository.findById(id).get();
}

/**
* 分页
*/
public Page<User> getPageByid(String parentId, int page , int size){
    return userRepository.getPageByid(parentId, PageRequest.of(page-1,size));
}

}

6、测试类

package com.guor;

import com.guor.bean.User; import com.guor.service.UserService; 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.domain.Page; import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class MongoDBTest { @Autowired private UserService userService;

@Test
public void saveUser(){
    User user=new User();
    user.setName("比比东");
    user.setAge(22);
    user.setPhone("1314");
    userService.insertUser(user);
}

@Test
public void getUser(){
    List<User> list = userService.getAllUser();
    for(User user : list){
        System.out.println(user);
    }
}

@Test
public void updateUser(){
    User user=new User();
    user.setId("61e3d9ac57b3da05fd0fffed");
    user.setName("云韵");
    user.setAge(29);
    user.setPhone("18525351592");
    user.setParentid("1");
    userService.updateUser(user);
}

@Test
public void getUserPage(){
    Page<User> pageResponse = userService.getPageByid("1",1, 2);
    System.out.println("----总记录数:"+pageResponse.getTotalElements());
    System.out.println("----当前页数据:"+pageResponse.getContent());

}

@Test
public void deleteUser(){
    String id = "61e3daf31faa1f5b0e6849f8";
    userService.deleteUserById(id);
}

}

7、插入 alt

8、更新 alt alt

9、查询 alt

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
05-09 13:22
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务