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

一、准备

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> 

<!--spring-boot-starter-data-mongodb.jar 是在它的基础上进行的包装,
    使用了很多默认配置-->

 

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

二、编写代码

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);
    }

   @Test
    public void getOne(){
        //不指定数据集,根据实体类的类名获取数据集。 这里Person也会被当作collectionName
        Person zz = testMongoTemplate.findOne(query(where("name").is("tom5")), Person.class);
        //指定数据集   同一个数据库下,建了一个user集合,跟person结构相同,这时就要指定了
        Person one = testMongoTemplate.findOne(query(where("name").is("tom5")), Person.class,"user");
        System.out.println(one);
    }

}

5、测试结果

三、待补充

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章