一、mongodb简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点:
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据;
- 模式自由;
- 支持动态查询;
- 支持完全索引,包含内部对象;
- 支持查询;
- 支持复制和故障恢复;
- 使用高效的二进制数据存储,包括大型对象(如视频等);
- 自动处理碎片,以支持云计算层次的扩展性;
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言;
- 文件存储格式为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;
}
}