Java构建多mongo数据源客户端

文章目录

      • 一、First of all
      • 二、去掉启动类中的mongoConfig自动注入
      • 三、配置文件
      • 四、实现类
      • 五、怎么用

做人太难,做事简单点。

看了很多基于java构建多mongo多数据源客户端的文章,发现大部分都是通过Springboot的mongoTemplate去实现的,实现方式和mysq多数据源的方式比较类似。但是这种实现方式如果存在很多数据源的情况下一个是实现文件多,二不好管理,三每次都需要单独去继承config类,太麻烦了。

参考mongoClient官方文档写了一个简单、快速构建mongo多数据源客户端的实现。

本类兼容Springboot2.X高版本和低版本

一、First of all

引入maven依赖,如果原来引入了spring-boot-starter-data-mongodb请去掉,不然会出现包冲突。

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.0.5</version>
</dependency>

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-legacy</artifactId>
    <version>4.0.5</version>
</dependency>

二、去掉启动类中的mongoConfig自动注入

去掉服务启动类中的MongoAutoConfiguration自动注入,不然每次都会出现拒绝本地连接的异常(自动注入会自动加载localhost的mongo地址)

@SpringBootApplication(exclude = {MongoAutoConfiguration.class})

三、配置文件

activity的值用于判断该类是否构建,如果不等于true则不会构建该类
uri里面的值就是每个mongo数据源的名字,名字可以自定义,用于使用mongoClient的时候获取对应的mongodatabase对象
每个uri里面的值和正常配置mongoTemplate的时候是一样的

spring.data.mongodb.activity = true
spring.data.mongodb.uri[test1]=mongodb://localhost:17017/test1_dev
spring.data.mongodb.uri[test2]=mongodb://root:root@localhost:27017,localhost:27018/test2_dev

四、实现类

把这个文件随便放在你项目的什么地方吧,只要上面的配置格式正确配置即可

import com.mongodb.client.*;
import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.beans.ConstructorProperties;
import java.util.HashMap;

/*
 * @author  Carol
 * @create  2020/8/14 15:50
 * @Description
 */
@Component
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb")
@ConditionalOnProperty(prefix = "spring.data.mongodb", name = "activity", havingValue = "true")
public class MongoClientsInit {

    private HashMap<String, String> uri;

    private HashMap<String, MongoDatabase> mongoClientDatabases = new HashMap<>();

    private String getDatabase(String mongoUri){
        String databaseName = "";
        String substring = mongoUri.substring(10, mongoUri.length());
        String[] split = substring.split("/");
        String database = split[1];
        if (database.contains("?")){
            databaseName = database.split("\\?")[0];
        }else {
            databaseName = database;
        }
        return databaseName;
    }


    public void init() throws Exception{
        //System.out.println(uri);
        for (String name : uri.keySet()) {
            String url = uri.get(name);
            MongoClient mongoClient = MongoClients.create(url);
            MongoDatabase mongoClientDatabase = mongoClient.getDatabase(getDatabase(url));
            mongoClientDatabases.put(name, mongoClientDatabase);
        }
    }
}

五、怎么用

下面以一个带条件的查询作为示例,展示怎么使用这个类
类中的 DateUtil 包在我的github中可以看到

import com.alibaba.fastjson.JSONObject;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/*
 * @author  Carol
 * @create  2020/8/14 17:40
 * @Description
 */
@Service
public class MongoSourceFind {
    
    @Autowired
    private MongoClientsInit mongoClientsInit;
    
    public void find(){
        String startTime = "2020-08-13 00:00:00";
        String endTime = "2020-08-14 00:00:00";
        Date start = DateUtil.dateStringToDate(startTime, DateUtil.DATEFORMATE.FULLTIMEBY_yMdHms);
        Date end = DateUtil.dateStringToDate(endTime, DateUtil.DATEFORMATE.FULLTIMEBY_yMdHms);
        Document document = new Document("lastModifiedTime", new Document("$gte", start).append("$lt", end));
        List<JSONObject> sources = new ArrayList<>();
        //获取你需要的客户端对象
        MongoDatabase mongoDatabase = mongoClientsInit.getMongoClientDatabases().get("test1");
        //查询 collection1 表中 lastModifiedTime 字段在 startTime 和 endTime 时间范围内的数据
        MongoCursor<Document> documentMongoCursor = mongoDatabase.getCollection("collection1").find(document).iterator();
        while (documentMongoCursor.hasNext()){
            //对获取到的每一条数据转换成Json对象
            JSONObject parseObject = JSONObject.parseObject(documentMongoCursor.next().toJson());
            sources.add(parseObject);
        }
        System.out.println(sources);
    }

}

你可能感兴趣的:(JAVA,java,spring,boot,mongodb)