Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源

全文内容:

Mongodb安装

说明:Mongodb和redis是开发中常用的中间件,Redis的安装使用比较简单就不写了,只说本地也就是Windows安装Mongodb。

SpringBoot集成MongoDB和Redis

文中还有一个彩蛋Hutool

 

1.下载最新稳定版

https://www.mongodb.com/what-is-mongodb

例如我下载的版本是:mongodb-win32-x86_64-enterprise-windows-64-4.2.3-signed.msi 

2.安装

选择complete,完整安装(安装全部组件)。complete,完整的、完全的。

默认选项即可:

这里取消勾选:

由于我已经安装好,不能再截图,如果还有不清楚的同学可以看这里:

https://www.cnblogs.com/chy18883701161/p/11100560.html 

 

3.确认Windows服务启动

测试:http://localhost:27017/

4.控制台

安装目录的bin目录,例如C:\Program Files\MongoDB\Server\4.2\bin 。

使用mongo启动客户端

可以查看数据库和添加管理员账户

>show dbs
>use admin
>db.createUser({user:"admin",pwd:"password",roles:["root"]})
>db.auth("admin", "password")

创建一个数据库paopaoedu,

增加一个数据库管理员,用户名密码 paopaoedu//paopaoedu

插入一条数据,查询一条数据

>use paopaoedu
>db.createUser({user: "paopaoedu", pwd: "paopaoedu", roles: [{ role: "dbOwner", db: "paopaoedu" }]})
>db.auth("paopaoedu", "paopaoedu")
>db.paopaoedu.insert({"host":" https://linuxstyle.blog.csdn.net/"})
>db.paopaoedu.find()

https://www.cnblogs.com/mengyu/p/9071371.html

 

5.使用图形化客户端

实际开发中一般不会用命令行,这个效率太低了,推荐的客户端是robo3t,注意一定要下1.3.1不要用低版本,不然会报错不能打开数据库列表

robo3t-1.3.1-windows-x86_64-7419c406.exe

错误一:Error: Failed to execute "listdatabases" command​

这是因为没有创建超级管理员账户或者数据库管理员账户

错误二:Network error while attempting to run command 'saslStart' on host 'xxx:27017'

这是因为robo3t版本低于1.3.1

 

6.SpringBoot集成MongoDB和Redis

MongoDB安装好以后是要在实际项目中使用的,现在都是SpringBoot。

SpringBoot集成MongoDB真的已经很简单了。考虑到redis的使用也很简单就一并集成了。

maven:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>

说明:Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率。hutool-all这个Util的jar非常方便,比如一些时间等常见的都被集成了。https://hutool.cn/docs/#/

Hutool包含组件

一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

模块 介绍
hutool-aop JDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache 简单缓存实现
hutool-core 核心,包括Bean操作、日期、各种Util等
hutool-cron 定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto 加密解密模块,提供对称、非对称和摘要算法封装
hutool-db JDBC封装后的数据操作,基于ActiveRecord思想
hutool-dfa 基于DFA模型的多关键字查找
hutool-extra 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http 基于HttpUrlConnection的Http客户端封装
hutool-log 自动识别日志实现的日志门面
hutool-script 脚本执行封装,例如Javascript
hutool-setting 功能更强大的Setting配置文件和Properties封装
hutool-system 系统参数调用封装(JVM信息等)
hutool-json JSON实现
hutool-captcha 图片验证码实现
hutool-poi 针对POI中Excel的封装
hutool-socket 基于Java的NIO和AIO的Socket封装

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。

配置文件:

server.port=8080

# Redis数据库索引(默认为0)
spring.redis.database=0 
# Redis服务器地址
spring.redis.host=你的redis主机IP
# Redis服务器连接端口
spring.redis.port=6379 
# Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8 
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1 
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8 
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0 
# 连接超时时间(毫秒)
spring.redis.timeout=300

## 无密码配置
## 如果存在此库就直接连接,如果不存在此库会自动创建
#spring.data.mongodb.uri=mongodb://localhost:27017/springboot_mongodb

## 有密码配置
## name:用户名 / password:密码
spring.data.mongodb.uri=mongodb://paopaoedu:paopaoedu@localhost:27017/paopaoedu

 model对象:

public class User implements Serializable {

    private static final long serialVersionUID = -1L;

    private String username;
    private String city;
    private Integer age;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}

这里为了简单只是演示就写一起,不分模块了: 

@RestController
public class TestController {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Autowired
    private MongoTemplate mongoTemplate;


    @RequestMapping("/")
    public String sayHello() {
        String nowtime= DateUtil.now();
        redisTemplate.opsForValue().set("nowtime",nowtime);
        String rs=redisTemplate.opsForValue().get("nowtime");

        User u=new User();
        u.setUsername("霞落满天");
        u.setCity("银河系");
        u.setAge(12);
        mongoTemplate.insert(u);

        List<User> ulist=mongoTemplate.findAll(User.class);
        String json = JSON.toJSONString(ulist);

        return "HelloWorld SpringBoot "+rs+"    "+json;
    }
}

 Redis用这个客户端:redis-desktop-manager-0.8.8.384.exe

 

多数据源的配置

单数据源自动读配置文件,多数据源自然需要你指定数据源,然后使用注解的方式。其实不管是redis还是mongodb还是MYSQL套路都是一样的,就是定义不同数据源,然后定义多个配置工厂的bean,要用的时候注入即可。

Redis多数据源参考:

https://blog.csdn.net/liubenlong007/article/details/86477692

这个的工程化更好一点,一个数据源一个独立的class比较好

https://blog.csdn.net/huangpeigui/article/details/90518844

 

mongodb多数据源参考:

https://blog.csdn.net/qq_28851503/article/details/90340642

 

以redis为例,下面是我修改的代码,如果需要可以按需增加连接池配置。

先定义配置文件,假设我们有2个不同的Redis:

# Redis服务器地址
spring.redis.master.host=xxx.redis.rds.aliyuncs.com
# Redis服务器连接端口
spring.redis.master.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.master.password=xxx

# Redis服务器地址
spring.redis.follow.host=xxx.redis.rds.aliyuncs.com
# Redis服务器连接端口
spring.redis.follow.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.follow.password=xxx

 maven增加依赖库:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

定义数据源配置文件:


@Configuration
public class RedisConfig {

    //master
    @Value("${spring.redis.master.host}")
    private String masterHost;

    @Value("${spring.redis.master.port}")
    private String masterPort;

    @Value("${spring.redis.master.password}")
    private String masterPassword;

    //salve
    @Value("${spring.redis.follow.host}")
    private String salveHost;

    @Value("${spring.redis.follow.port}")
    private String salvePort;

    @Value("${spring.redis.follow.password}")
    private String salvePassword;

    /**
     * 配置lettuce连接池
     *
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
    public GenericObjectPoolConfig redisPool() {
        return new GenericObjectPoolConfig<>();
    }

    /**
     * 配置第一个数据源的
     *
     * @return
     */
    @Bean
    //@ConfigurationProperties(prefix = "spring.redis")
    public RedisStandaloneConfiguration redisConfig1() {
        RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();
        rsc.setHostName(masterHost);
        rsc.setPort(Integer.parseInt(masterPort));
        rsc.setPassword(masterPassword);
        return rsc;
    }

    /**
     * 配置第二个数据源
     *
     * @return
     */
    @Bean
    //@ConfigurationProperties(prefix = "spring.redis.follow")
    public RedisStandaloneConfiguration redisConfig2() {
        RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();
        rsc.setHostName(salveHost);
        rsc.setPort(Integer.parseInt(salvePort));
        rsc.setPassword(salvePassword);
        return rsc;
    }

    /**
     * 配置第一个数据源的连接工厂
     * 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory
     *
     * @param config
     * @param redisConfig1
     * @return
     */
    @Bean("factory1")
    @Primary
    public LettuceConnectionFactory factory(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig1) {
        LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
        return new LettuceConnectionFactory(redisConfig1, clientConfiguration);
    }

    @Bean("factory2")
    public LettuceConnectionFactory factory2(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig2) {
        LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
        return new LettuceConnectionFactory(redisConfig2, clientConfiguration);
    }

    /**
     * 配置第一个数据源的RedisTemplate
     * 注意:这里指定使用名称=factory 的 RedisConnectionFactory
     * 并且标识第一个数据源是默认数据源 @Primary
     *
     * @param factory1
     * @return
     */
    @Bean("redisTemplate1")
    @Primary
    public RedisTemplate<String, String> redisTemplate(@Qualifier("factory1") RedisConnectionFactory factory1) {
        return getStringStringRedisTemplate(factory1);
    }

    /**
     * 配置第一个数据源的RedisTemplate
     * 注意:这里指定使用名称=factory2 的 RedisConnectionFactory
     *
     * @param factory2
     * @return
     */
    @Bean("redisTemplate2")
    public RedisTemplate<String, String> redisTemplate2(@Qualifier("factory2") RedisConnectionFactory factory2) {
        return getStringStringRedisTemplate(factory2);
    }

    /**
     * 设置序列化方式 (这一步不是必须的)
     *
     * @param factory2
     * @return
     */
    private RedisTemplate<String, String> getStringStringRedisTemplate(RedisConnectionFactory factory2) {
        StringRedisTemplate template = new StringRedisTemplate(factory2);
        template.setKeySerializer(RedisSerializer.string());
        template.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
        template.setHashKeySerializer(RedisSerializer.string());
        template.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));
        return template;
    }

使用非常简单:

@Autowired
    @Qualifier("redisTemplate1")
    private RedisTemplate redisTemplate1;

    @Autowired
    @Qualifier("redisTemplate2")
    private RedisTemplate redisTemplate2;

 

发布了1616 篇原创文章 · 获赞 1236 · 访问量 1245万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览