文档章节

SpringBoot整合MongoDB多数据源

冯文议
 冯文议
发布于 07/01 18:32
字数 843
阅读 48
收藏 5

依赖

// build.gradle

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

配置文件

# application.yml

spring:
  data:
    mongodb:
      primary:
        uri: mongodb://localhost:27017/db1
      secondary:
        uri: mongodb://localhost:27017/db2

主数据库配置

// PrimaryMongoConfig.java

package com.fengwenyi.springboot_mongo_multi_source.config;

import com.mongodb.MongoClientURI;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
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.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

/**
 * MongoDB Primary Config
 * @author Erwin Feng
 * @since 2019-07-01 17:12
 */
@Configuration
@EnableMongoRepositories(basePackages = "com.fengwenyi.springboot_mongo_multi_source.primary",
        mongoTemplateRef = "primaryMongoTemplate")
public class PrimaryMongoConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.data.mongodb.primary")
    public MongoProperties primaryMongoProperties() {
        return new MongoProperties();
    }

    @Primary
    @Bean(name = "primaryMongoTemplate")
    public MongoTemplate primaryMongoTemplate() throws Exception {
        return new MongoTemplate(primaryFactory(primaryMongoProperties()));
    }

    @Bean
    @Primary
    public MongoDbFactory primaryFactory(MongoProperties mongoProperties) throws Exception {
        return new SimpleMongoDbFactory(new MongoClientURI(primaryMongoProperties().getUri()));
    }
}

副数据库配置

// SecondaryMongoConfig.java

package com.fengwenyi.springboot_mongo_multi_source.config;

import com.mongodb.MongoClientURI;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
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.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

/**
 * MongoDB Secondary Config
 * @author Erwin Feng
 * @since 2019-07-01 17:12
 */
@Configuration
@EnableMongoRepositories(basePackages = "com.fengwenyi.springboot_mongo_multi_source.secondary",
        mongoTemplateRef = "secondaryMongoTemplate")
public class SecondaryMongoConfig {

    @Bean
    @ConfigurationProperties(prefix="spring.data.mongodb.secondary")
    public MongoProperties secondaryMongoProperties() {
        return new MongoProperties();
    }

    @Bean(name = "secondaryMongoTemplate")
    public MongoTemplate secondaryMongoTemplate() throws Exception {
        return new MongoTemplate(secondaryFactory(secondaryMongoProperties()));
    }

    @Bean
    public MongoDbFactory secondaryFactory(MongoProperties mongoProperties) throws Exception {
        return new SimpleMongoDbFactory(new MongoClientURI(secondaryMongoProperties().getUri()));
    }
}

用户实体,副

// User.java

package com.fengwenyi.springboot_mongo_multi_source.secondary.entity;

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

import java.io.Serializable;
import java.time.Instant;

/**
 * 用户
 * @author Erwin Feng
 * @since 2019-07-01 17:15
 */
@Data
@Accessors(chain = true)
@Document(collection = "t_user")
public class User implements Serializable {

    private static final long serialVersionUID = -7229906944062898852L;

    /** ID */
    @Id
    private String id;

    /** 用户名 */
    private String username;

    /** 年龄 */
    private Integer age;

    /** 注册时间 */
    private Instant registerTime;
}

用户查询仓库,副

// UserRepository.java

package com.fengwenyi.springboot_mongo_multi_source.secondary.repository;

import com.fengwenyi.springboot_mongo_multi_source.secondary.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

/**
 * 用户
 * @author Erwin Feng
 * @since 2019-07-01 17:18
 */
public interface UserRepository extends MongoRepository<User, String> {

    /**
     * 通过用户名查询
     * @param username 用户名
     * @return
     */
    List<User> findAllByUsername(String username);

}

登录日志实体,主

// LoginLog.java

package com.fengwenyi.springboot_mongo_multi_source.primary.entity;

import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;

import java.io.Serializable;
import java.time.Instant;

/**
 * 登录日志
 * @author Erwin Feng
 * @since 2019-07-01 17:18
 */
@Data
@Accessors(chain = true)
public class LoginLog implements Serializable {

    private static final long serialVersionUID = -6694661682102504919L;

    /** ID */
    @Id
    private String id;

    /** 用户ID */
    private String uid;

    /** 用户名 */
    private String username;

    /** 登录时间 */
    private Instant loginTime;
}

登录日志查询仓库,主

// LoginLogRepository.java

package com.fengwenyi.springboot_mongo_multi_source.primary.repository;

import com.fengwenyi.springboot_mongo_multi_source.primary.entity.LoginLog;
import org.springframework.data.mongodb.repository.MongoRepository;

/**
 * 登录日志
 * @author Erwin Feng
 * @since 2019-07-01 17:21
 */
public interface LoginLogRepository extends MongoRepository<LoginLog, String> {
}

初始化

// InitController.java

package com.fengwenyi.springboot_mongo_multi_source.controller;

import com.fengwenyi.springboot_mongo_multi_source.secondary.entity.User;
import com.fengwenyi.springboot_mongo_multi_source.secondary.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

/**
 * 初始化工具类
 * @author Erwin Feng
 * @since 2019-07-01 17:24
 */
@RestController
public class InitController {

    /** [mongo] 用户 */
    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    public void init() {
        List<User> all = userRepository.findAll();
        if (all.size() > 0)
            return;
        userRepository.save(new User().setUsername("Zhangsan").setAge(20).setRegisterTime(Instant.now()));
        List<User> users = new ArrayList<>();
        User u1 = new User().setUsername("u1").setAge(19).setRegisterTime(Instant.now());
        User u2 = new User().setUsername("u2").setAge(20).setRegisterTime(Instant.now());
        User u3 = new User().setUsername("u3").setAge(10).setRegisterTime(Instant.now());
        users.add(u1);
        users.add(u2);
        users.add(u3);
        userRepository.saveAll(users);
    }

}

测试代码

// TestController.java

package com.fengwenyi.springboot_mongo_multi_source.controller;

import com.fengwenyi.springboot_mongo_multi_source.primary.entity.LoginLog;
import com.fengwenyi.springboot_mongo_multi_source.primary.repository.LoginLogRepository;
import com.fengwenyi.springboot_mongo_multi_source.secondary.entity.User;
import com.fengwenyi.springboot_mongo_multi_source.secondary.repository.UserRepository;
import net.iutil.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Instant;
import java.util.List;

/**
 * 测试
 * @author Erwin Feng
 * @since 2019-07-01 17:28
 */
@RestController
@RequestMapping("/test")
public class TestController {

    /** [mongo] 用户 */
    @Autowired
    private UserRepository userRepository;

    /** [mongo] 登录日志 */
    @Autowired
    private LoginLogRepository loginLogRepository;

    /** [mongo] */
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 登录
     * @param username
     * @return
     */
    @GetMapping("/login")
    public ApiResult login(String username) {
        if (StringUtils.isEmpty(username))
            return ApiResult.error().setMsg("用户名不能为空");
        List<User> users = userRepository.findAllByUsername(username);
        if (users.size() == 1) {
            // 记录日志
            loginLogRepository.save(new LoginLog().setUid(users.get(0).getId()).setUsername(username).setLoginTime(Instant.now()));
            return ApiResult.success();
        }
        if (users.size() == 0)
            return ApiResult.error().setMsg("用户名查询失败");

        return ApiResult.error().setMsg("用户异常");
    }

    /**
     * 登录日志
     * @return
     */
    @GetMapping("/login-log")
    public ApiResult loginLog() {
        Query query = new Query();
        List<LoginLog> loginLogs = mongoTemplate.find(query, LoginLog.class);
        return ApiResult.success(loginLogs);
    }

}

测试用户登录

GET http://localhost:8080/test/login?username=Zhangsan

响应:

{
    "code": 0,
    "msg": "Success"
}

测试登录日志

GET http://localhost:8080/test/login-log

响应:

{
    "code": 0,
    "msg": "Success",
    "data": [
        {
            "id": "5d19d7f5cede54c46b6b20c5",
            "uid": "5d19d560cede54c45701e12a",
            "username": "Zhangsan",
            "loginTime": "2019-07-01T09:52:53.447Z"
        },
        {
            "id": "5d19da82cede54c46f77579a",
            "uid": "5d19d560cede54c45701e12a",
            "username": "Zhangsan",
            "loginTime": "2019-07-01T10:03:46.496Z"
        },
        {
            "id": "5d19df5fcede54c46f77579b",
            "uid": "5d19d560cede54c45701e12a",
            "username": "Zhangsan",
            "loginTime": "2019-07-01T10:24:31.272Z"
        },
        {
            "id": "5d19df6acede54c46f77579c",
            "uid": "5d19d560cede54c45701e12b",
            "username": "u1",
            "loginTime": "2019-07-01T10:24:42.199Z"
        },
        {
            "id": "5d19df6dcede54c46f77579d",
            "uid": "5d19d560cede54c45701e12d",
            "username": "u3",
            "loginTime": "2019-07-01T10:24:45.421Z"
        }
    ]
}

代码

springboot-mongo-multi-source

© 著作权归作者所有

冯文议
粉丝 11
博文 47
码字总数 47895
作品 0
成都
高级程序员
私信 提问
SpringBoot 整合MongoDB多数据源

SpringBoot 整合MongoDB多数据源 一、前情提要 1.环境:SpringBoot+Dubbo+Zookeeper+MongoDB 2.业务场景有多个数据源,因故需配置多数据源来满足业务需求 二、准备工作 1.什么是SpringBoot ht...

Noseparte
2018/08/14
0
0
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
8.7K
17
JAVA springboot b2b2c多用户商城系统源码 (八)springboot整合mongodb

准备工作 安装 MongoDB jdk 1.8 maven 3.0 idea 环境依赖 在pom文件引入spring-boot-starter-data-mongodb依赖: 数据操作dao层 写一个接口,继承MongoRepository,这个接口有了几本的CURD的...

sccspuercode
03/15
66
0
Spring Boot 全家桶 - SpringBootBucket

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
10.9K
8
SpringBootBucket 2.0.4 发布,代号“傲娇的小二晶”

SpringBootBucket 自从1.0.0版本发布后就有好多人喜欢,目前码云上面star数量接近1.2k。上个月还收到了红薯签名的1000 star奖杯,这个我自己也觉得很惊讶。 由于SpringBoot 1.x官方将终止维护...

一刀
2018/09/16
2.7K
4

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
今天
5
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部