一、準備
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試驗一下。