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);
}
}