欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springBoot+MongoTemplate,往多个数据库中插入数据

程序员文章站 2022-05-17 18:42:22
...

一、准备

1、建立一个springBoot的maven项目(使用spring initailizr,或者建立一个maven后自己添加相关springBoot配置)

<!--版本管理相关--> 
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
  </parent>

<!--springboot基础依赖包--> 
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

<!--springboot打jar包专用插件--> 
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

2、添加相关mongoDB依赖,直接使用spring-data-xxx系列jar

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>2.2.3.RELEASE</version>
    </dependency>

3、启动mongoDB,并有可视化客户端工具。本次在window下启动mongoDB,具体教程参考其官网,有详细介绍。建好两个库如下:

springBoot+MongoTemplate,往多个数据库中插入数据

二、编写代码

1、配置文件:

server:
  port:  8088
spring:
  data:
    mongodb:
      host: localhost
      host2: 10.99.86.87
    dbName:
      testDb: test
      userDb: user

2、自动配置类  @Configuration类

package com.steve.config;

import com.mongodb.MongoClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

@Configuration
public class MongoConfig {
    //读取配置文件里的值,部署后IP或者数据库名变化,不需重新打包
    @Value("${spring.data.mongodb.host}")
    private String mongohost;
    @Value("${spring.data.mongodb.host2}")
    private String mongohost2;
    @Value("${spring.data.dbName.testDb}")
    private String testDb;
    @Value("${spring.data.dbName.userDb}")
    private String userDb;

    @Bean
    @Primary
    public  MongoClient mongoClient() {
        return new MongoClient(mongohost);
    }
    @Bean
    public  MongoClient mongoClient2() {
        return new MongoClient(mongohost2);
    }
   /**
    * @Author  SteveTao
    * @Description  @Primary: 注解的作用是,在往IOC容器中注入同一个实体Bean的多个实例时
    * 优先注入该注解标注的实体。且多实例注入时,该注解是必须的,否则启动会报错:
    *               required a single bean, but 2 were found
    * @Date 2019/12/6 10:22
    **/
    @Bean
    @Primary
    public   MongoTemplate testMongoTemplate() {
        return new MongoTemplate(mongoClient(), testDb);
    }
    @Bean
    public   MongoTemplate userMongoTemplate() {
        return  new MongoTemplate(new SimpleMongoDbFactory(mongoClient(), userDb));
    }

}

3、实体类

import lombok.Data;
import org.springframework.stereotype.Component;

// 使用了Lombok插件,不需要写get,set方法。 不想用这个插件的这里自己添加就好了
@Component
@Data
public class Person {
    private String id;
    private String name;
    private int age;

    public Person() {
    }

    public Person(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

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

4、juint测试类

package com.steve;

import static org.junit.Assert.assertTrue;
import com.steve.bean.Person;
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.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;

//@SpringBootTest  测试类里面,可以注入并使用springIOC容器里的东西,不需要每次都起停程序
@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest{
    //这里用Resource,没有用Autoware
    @Resource
    private MongoTemplate testMongoTemplate;
    @Resource
    private MongoTemplate userMongoTemplate;

    //右键运行,看看两个库是否同时插入了数据
    @Test
    public void insert(){
        Person p=new Person("001","tom",88);
        testMongoTemplate.insert(p);
        Person p2=new Person("N0012","zhangsan",14);
        userMongoTemplate.insert(p2);
    }

    @Test
    public void queryon(){
        Person qp = testMongoTemplate.findOne(new Query(new Criteria("name").is("tom")), Person.class);
        System.out.println(qp);
    }

}

5、测试结果

springBoot+MongoTemplate,往多个数据库中插入数据

springBoot+MongoTemplate,往多个数据库中插入数据

springBoot+MongoTemplate,往多个数据库中插入数据

三、待补充

本次测试的是一个mongoDB链接下的不同数据库; 不同链接下的不同数据库,应该也是可以的。主要是在自动配置类里面,注入多个mongoClient实体类。不同的mongoTemplate使用对应的mongoClietn即可。

由于本机重装了系统,之前虚拟机的节点都删除了,现在手上没有多余的节点IP,这里不做展示了。感兴趣的可以用vmware起几个节点,装上mongoDB试验一下。