Java构建多mongo数据源客户端

2021-03-26  本文已影响0人  Coralcarol

@[toc]

做人太难,做事简单点。
看了很多基于java构建多mongo多数据源客户端的文章,发现大部分都是通过Springboot的mongoTemplate去实现的,实现方式和mysq多数据源的方式比较类似。但是这种实现方式如果存在很多数据源的情况下一个是实现文件多,二不好管理,三每次都需要单独去继承config类,太麻烦了。
参考mongoClient官方文档写了一个简单、快速构建mongo多数据源客户端的实现。
本类兼容Springboot2.X高版本和低版本
本次对代码进行了优化更新,兼容在不需要mongo的情况的使用以及不需要手动去启动类中使用exclude了

一、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>

二、配置文件

uri里面的值就是每个mongo数据源的名字,名字可以自定义,用于使用mongoClient的时候获取对应的mongodatabase对象
每个uri里面的值和正常配置mongoTemplate的时候是一样的

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.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import lombok.Data;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;

/*
 * @author  Carol
 * @create  2020/8/17 9:50
 * @Description
 */
@Component
@Data
@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoClientsInit {

    private HashMap<String, String> uri;

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

    private String getDatabase(String mongoUri) throws Exception{
        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;
    }


    @PostConstruct
    public void init() throws Exception{
        if (uri.size() > 0){
            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);
    }

}
上一篇 下一篇

猜你喜欢

热点阅读