Spring boot链接多个mongodb数据库

整体目录结构

首先 在config包中创建AbstractMongoDbConfig抽象类

package com.ke.deviceact.config;

import lombok.Data;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;

@Data
public abstract class AbstractMongoDbConfig {
    private String uri;
    private String username;
    private String password;
    private String database;
    public MongoDatabaseFactory mongoDatabaseFactory() {
//        String connectionString = "mongodb://" + username + ":" + password+ "@"+ uri +"/" + database;
        String connectionString = uri;

        return new SimpleMongoClientDatabaseFactory(connectionString);
    }
    public abstract MongoTemplate getMongoTemplate();
}

在创建两个MongoTemplate的组件

package com.ke.deviceact.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;

@Configuration
@ConfigurationProperties("mongodb.admin")
public class MongoDbConfigAdmin extends AbstractMongoDbConfig{
    @Bean(name = "mongoTemplateAdmin")
    @Override
    public MongoTemplate getMongoTemplate() {
        return new MongoTemplate(mongoDatabaseFactory());
    }
}

上面具体的注解有不清楚的请自己百度一下吧

package com.ke.deviceact.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
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;

@Configuration
@ConfigurationProperties(value = "mongodb.primary")
public class MongoDbConfigPrimary extends AbstractMongoDbConfig{
    @Primary
    @Bean(name = "mongoTemplatePrimary")
    @Override
    public MongoTemplate getMongoTemplate() {
        return new MongoTemplate(mongoDatabaseFactory());
    }
}

再看一下application.yml中的配置

mongodb:
  primary:
    uri: mongodb://*****/库的名字
    username: aaa
    password: bbb
    database: ccc
  admin:
    uri: mongodb://*****/库的名字
    username: aaa
    password: bbb
    database: ccc

如果选用uri的方式就不需要用用户名和密码配置了

开始定义service GpsServiceImpl 注意这里的@Resource用的是admin的 mongo

package com.ke.deviceact.service.impl.impl;

import com.ke.deviceact.model.MDeviceState;
import com.ke.deviceact.service.impl.GpsService;
import lombok.extern.slf4j.Slf4j;
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.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Slf4j
@Service
public class GpsServiceImpl implements GpsService {
    //这里用name来指定选择用哪个mongoTemplate
    @Resource(name = "mongoTemplateAdmin")
    private MongoTemplate mongoTemplateAdmin;
    
    @Resource(name = "mongoTemplatePrimary")
    private MongoTemplate mongoTemplatePrimary;

    @Override
    public void getGps(){
        Query q = new Query();
        q.addCriteria(Criteria.where("deviceId").is("068101115122"));
        List<MDeviceState> device_state = mongoTemplateAdmin.find(q,MDeviceState.class,"device_state");
        log.info("device_state{}",device_state);
        getGpsPrimary()
    }
    //同理这里用另一个测试一下
    public void getGpsPrimary(){
        Query q = new Query();
        q.addCriteria(Criteria.where("deviceId").is("068101115122"));
        List<MDeviceState> device_state = mongoTemplatePrimary.find(q,"device_state");
        log.info("device_state_Primary{}",device_state);
    }
}

Model类具体根据自己的表结构来定义

package com.ke.deviceact.model;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;

@Data
@Document("device_state")
public class MDeviceState implements Serializable {
    @Id
    @Field("_id")
    private String id;
    private String deviceId;
    private int status=0;
}
package com.ke.deviceact.service.impl;

public interface GpsService {
    void getGps();
}

最后注意在启动类上加上@EnableConfigurationProperties

package com.ke.deviceact;

import com.ke.deviceact.config.MongoDbConfigAdmin;
import com.ke.deviceact.config.MongoDbConfigPrimary;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@EnableConfigurationProperties({MongoDbConfigAdmin.class,MongoDbConfigPrimary.class})
@SpringBootApplication
public class ActApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActApplication.class,args);
    }
}

在定义测试类进行测试就行了

import com.ke.deviceact.ActApplication;
import com.ke.deviceact.service.impl.GpsService;
import com.ke.deviceact.service.impl.TuShangPushService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest(classes = ActApplication.class)
public class KyTest {
    @Autowired
    private GpsService gpsService;

    @Autowired
    private TuShangPushService tuShangPushService;
    @Test
    public void testGps(){

        gpsService.getGps();
        tuShangPushService.getPushAct();
    }


}

相关文章

文章浏览阅读552次。com.mongodb.MongoQueryException: Quer...
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQ...
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atla...
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_sprin...
文章浏览阅读673次。MongoDB 简介_尚医通sql