Spring Boot 整合 MongoDB

一、MongoDB介绍

MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前noSql数据库产品中最热门的一种。它在许多场景下用于替代传统的关系型数据库或键值对存储方式,MongoDB是用C++开发,MongoDB的官方网址为 http://www.mongodb.org/

二、MongoDB特点

1. 特点

  • 面向集合存储,易于存储对象类型的数据
  • 模式自由
  • 支持动态查询
  • 支持完全索引,包含内部对象
  • 支持查询
  • 支持复制和故障恢复
  • 使用高效的二进制数据存储,包括大型对象(如视频等)
  • 自动处理碎片,以支持云计算的扩展性
  • 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序
  • 社区中也提供了对 Erlang 及.NET 等平台的驱动程序
  • 文件存储格式为 BSON(一种 JSON 的扩展)
  • 可通过网络访问

2. 功能

  • 面向集合的存储:适合存储对象及 JSON 形式的数据
  • 动态查询:MongoDB 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易
  • 查询文档中内嵌的对象及数组
  • 完整的索引支持:包括文档内嵌对象及数组。MongoDB 的查询优化器会分析查询表达式,并生成一个高效的查询计划 
  • 查询监视:MongoDB 包含一系列监视工具用于分析数据库操作的性能
  • 复制及自动故障转移:MongoDB 数据库支持服务器之间的数据复制,支持主-从模式及
  • 服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
  • 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器

3. 适用场合

  • 网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
  • 缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储
  • 高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对 MapReduce 引擎的内置支持
  • 用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询

 

三、运行 springboot-mongodb 工程案例

git clone 下载工程 springboot-learning-example ,项目地址见 GitHub –  https://github.com/zyuQ/springboot-learning-example.git

1. 安装MongoDB

详情跳转文章 -> MongoDB安装

2. 创建数据库

 

:创建成功之后通过 show dbs 查询数据库。没有test 这个数据库是因为这个数据库目前没有数据,所以没有显示,实际上是已经创建成功了。 

3. springboot-mongodb 功能代码结构

org.springboot.controller  -  Controller 层

org.springboot.dao        -  数据访问层

org.springboot.pojo     -  实体类

Application        -  应用启动类

application.yml       -        应用配置类

四、springboot-mongodb 工程代码详解

1. 工程项目Maven依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

2. application.yml 加入mongoDB相关配置

spring:
  data:
    mongodb:
      url: mongodb://localhost:27017/test   # 我用的是本地安装的MongoDB,所以没有用户名和密码。
#      url: mongodb://name:pass@localhost:27017/test   # name: 用户名, pass: 密码
#      url: mongodb://192:168:1:1:20000,192:168:1:2:20000,192:168:252:12:20000/test   # 配置多个数据库用,则中间用 “,” 分割

User.class

package springboot.pojo;

/**
 * 用户实体类
 */
public class User {

    /**
     * 用户编号
     */
    private Long id;

    /**
     * 用户名称
     */
    private String userName;

    /**
     * 用户年龄
     */
    private int age;

    /**
     * 用户描述
     */
    private String desc;

    public Long getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

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

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

UserDao.class

package springboot.dao;

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.Component;
import springboot.pojo.User;

import java.util.List;

/**
 * @Description:
 * @Author: zyu
 */
@Component
public class UserDao {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 创建对象
     * @param user
     */
    public User saveUser(User user) {
        User save = mongoTemplate.save(user);
        return save;
    }


    /**
     * 更新对象
     * @param user
     */
    public void updateUser(User user) {
        Query query = new Query(Criteria.where("id").is(user.getId()));
        Update update = new Update().set("userName", user.getUserName()).set("age", user.getAge()).set("desc", user.getDesc());
        mongoTemplate.updateFirst(query, update, User.class);
    }


    /**
     * 根据用户名查询对象
     * @param name
     * @return
     */
    public User findUserByName(String name) {
        Query query = new Query(Criteria.where("userName").is(name));
        User user = mongoTemplate.findOne(query, User.class);
        return user;
    }


    /**
     * 查询所有对象
     * @return
     */
    public List<User> findUserList() {
        List<User> all = mongoTemplate.findAll(User.class);
        return all;
    }


    /**
     * 删除对象
     * @param id
     */
    public void deleteUserById(String id) {
        Query query = new Query(Criteria.where("id").is(id));
        mongoTemplate.remove(query, User.class);
    }

}

HomeController.class

package springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springboot.dao.UserDao;
import springboot.pojo.User;

import java.util.List;

/**
 * @Description:
 * @Author: zyu
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserDao userDao;

    @GetMapping("/findList")
    public List<User> findUserList() {
        List<User> userList = userDao.findUserList();
        return userList;
    }


    @GetMapping("/findByName")
    public User findUserByName(@RequestParam String name) {
        User userByName = userDao.findUserByName(name);
        return userByName;
    }


    @GetMapping("/save")
    public User saveUser(@RequestParam long id,@RequestParam String name, @RequestParam Integer age, @RequestParam String desc) {
        User user = new User();
        user.setUserName(name);
        user.setAge(age);
        user.setDesc(desc);
        user.setId(id);
        return userDao.saveUser(user);
    }


    @GetMapping("/update")
    public String updateUser(@RequestParam long id, @RequestParam String name, @RequestParam Integer age, @RequestParam String desc) {
        User user = new User();
        user.setUserName(name);
        user.setDesc(desc);
        user.setAge(age);
        user.setId(id);
        userDao.updateUser(user);
        return "Success";
    }

}

:如果保存的时候不存id,mongo会按照自己的规则分配一个字符串类型的id

下面我们启动程序进行测试

1. 新增: http://127.0.0.1:8080/user/save?id=1&name=zyu&age=21&desc=喜欢美食与旅行

可以看到新增成功

可以通过命令行: use test 进入 test 这个数据库

然后通过:db.user.find()  查询user这个文档对象下所有的数据

 

其他接口大家自己去测试吧

代码示例

本文示例读者可以通过查看下面仓库中代码:

原文地址:https://www.cnblogs.com/zyulike/p/11958927.html