一、准备
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: localhosthost2: 10.99.86.87dbName:testDb: testuserDb: 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@Primarypublic MongoClient mongoClient() {return new MongoClient(mongohost);}@Beanpublic 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@Primarypublic MongoTemplate testMongoTemplate() {return new MongoTemplate(mongoClient(), testDb);}@Beanpublic 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;}@Overridepublic 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@Resourceprivate MongoTemplate testMongoTemplate;@Resourceprivate MongoTemplate userMongoTemplate;//右键运行,看看两个库是否同时插入了数据@Testpublic void insert(){Person p=new Person("001","tom",88);testMongoTemplate.insert(p);Person p2=new Person("N0012","zhangsan",14);userMongoTemplate.insert(p2);}@Testpublic void queryon(){Person qp = testMongoTemplate.findOne(new Query(new Criteria("name").is("tom")), Person.class);System.out.println(qp);}@Testpublic void getOne(){//不指定数据集,根据实体类的类名获取数据集。 这里Person也会被当作collectionNamePerson 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试验一下。