SpringBoot整合MongoDB

一、mongodb简介

          MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

          MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

特点:

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  • 面向集合存储,易存储对象类型的数据;
  • 模式自由;
  • 支持动态查询
  • 支持完全索引,包含内部对象;
  • 支持查询;
  • 支持复制和故障恢复;
  • 使用高效的二进制数据存储,包括大型对象(如视频等);
  • 自动处理碎片,以支持云计算层次的扩展性;
  • 支持RUBYPYTHONJAVAC++PHPC#等多种语言;
  • 文件存储格式为BSON(一种JSON的扩展);
  • 可通过网络访问。

二、SpringBoot+MongoMD

1、MongoMD安装

https://blog.csdn.net/typ1805/article/details/82910009

2、创建springboot工程

实体User.java 类:

package com.example.demo.mongodb.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;

import java.io.Serializable;

/**
 * 路径:com.example.demo.mongodb.service.impl
 * 类名:
 * 功能:《用一句描述一下》
 * 备注:
 * 创建人:typ
 * 创建时间:2018/9/30 17:19
 * 修改人:
 * 修改备注:
 * 修改时间:
 */
@Data
public class User implements Serializable{

    // @id这个注解来对应mongo的_id这个字段
    @Id
    private String id;
    private String name;
    private int age;

}

service接口UserService.java类:

package com.example.demo.mongodb.service;

import com.example.demo.mongodb.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

/**
 * 路径:com.example.demo.mongodb.service
 * 类名:
 * 功能:《用一句描述一下》
 * 备注:
 * 创建人:typ
 * 创建时间:2018/9/30 17:16
 * 修改人:
 * 修改备注:
 * 修改时间:
 */
public interface UserService extends MongoRepository<User, String> {

    User findByName(String name);

}

UserController.java 类:

package com.example.demo.mongodb.controller;

import com.example.demo.mongodb.entity.User;
import com.example.demo.mongodb.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Optional;

/**
 * 路径:com.example.demo.mongodb.controller
 * 类名:
 * 功能:《用一句描述一下》
 * 备注:
 * 创建人:typ
 * 创建时间:2018/9/30 17:19
 * 修改人:
 * 修改备注:
 * 修改时间:
 */
@Slf4j
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/find")
    public List<User> find(){
        List<User> list = userService.findAll();
        return list;
    }

    @GetMapping("/getById")
    public Optional<User> getById(String id){

        return userService.findById(id);
    }

    @GetMapping("/getByName")
    public User getByName(String name){
        User user = userService.findByName(name);
        return user;
    }

    @PostMapping("/save")
    public String save(@RequestBody User user){
        try{
            userService.save(user);
            return "成功!";
        }catch (Exception e){
            return "失败!";
        }
    }

    @GetMapping("/del")
    public String del(String id){
        try{
            userService.deleteById(id);
            return "成功!";
        }catch (Exception e){
            return "失败!";
        }
    }

}

application.yml配置文件

server:
  port: 8081

spring:
  data:
    mongodb:
      uri: mongodb://admin:admin@127.0.0.1:27017/text

启动类:

package com.example.demo.mongodb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MongodbDemoApplication {

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

测试类:

package com.example.demo.mongodb;

import com.example.demo.mongodb.controller.UserController;
import com.example.demo.mongodb.entity.User;
import lombok.extern.slf4j.Slf4j;
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.test.context.junit4.SpringRunner;

import java.util.Optional;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbDemoApplicationTests {

	@Autowired
	private UserController userController;

	@Test
	public void save() {
		User user = new User();
		user.setName("AAA");
		user.setAge(21);
		userController.save(user);
	}

	@Test
	public void getByName() {
		User user = userController.getByName("AAA");
		log.info(user.toString());
	}

	@Test
	public void getById() {
		Optional<User> user = userController.getById("5bbad429e54ff22fecae8fc7");
		log.info("==========="+user.get().getName());
	}

}

三、实现动态切换数据库

最近项目中对mongo数据库进行了分库分表,所以数据库不能在配置文件里配置死,这里做了一下封装。

1、配置类

package com.demo.config;

import com.mongodb.MongoClientURI;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @ClassName: MongoTemplate.java
 * @Path: com.demo.config.MongoTemplateConfig.java
 * @Description:mongo配置动态切换数据库
 * @Author: tanyp
 * @Date: 2020/4/29 9:56
 * @Reviser:
 */
@Component
public class MongoTemplateConfig {

    @Value("${spring.data.mongodb.uri}")
    private String mongoAddress;

    private static final Map<String, MongoTemplate> mongoTemplateMap = new HashMap<>();

    public MongoTemplate createMongo(String dbName) {
        MongoTemplate mongoTemplate = mongoTemplateMap.get(dbName);
        if (Objects.isNull(mongoTemplate)) {
            synchronized (this) {
                mongoTemplate = mongoTemplateMap.get(dbName);
                if(Objects.isNull(mongoTemplate)){
                    String uri = mongoAddress.substring(0, mongoAddress.lastIndexOf("/"));
                    StringBuffer sb = new StringBuffer();
                    sb.append(uri).append("/").append(dbName);
                    MongoClientURI mongoClientURI = new MongoClientURI(sb.toString());
                    MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClientURI);
                    mongoTemplate = new MongoTemplate(mongoDbFactory);
                    mongoTemplateMap.put(dbName, mongoTemplate);
                }
            }
        }
        return mongoTemplate;
    }
}

2、测试

@RestController
public class TestController {

    @Autowired
    private MongoTemplateConfig myMongoTemplate;

    @GetMapping("test")
    public Map<String,Object> test(){
        String dbName = "test_ramus_2020";
        List<HashMap> list = myMongoTemplate.createMongo(dbName).find(
                new Query(Criteria.where("name").in("zhangsan")),HashMap.class,"test_2020"
        );
        Map<String,Object> result = new HashMap<>();
        result.put("data", list);
        return result;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值