SpringBoot - MongoDB

摘自:https://www.zhaochao.top/article/138,更多开发技术请访问 https://www.zhaochao.top

 

一 引入依赖

<dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

二 application.properties配置

spring.data.mongodb.uri=mongodb://username:password@ip:port(一般为27017)/test

三 编写CRUD

package com.study.springboot.SpringBoot_A.cache.mongodb.impl;

import com.study.springboot.SpringBoot_A.bean.User;
import com.study.springboot.SpringBoot_A.cache.mongodb.MongoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author 赵超
 * @Description
 * @create 2018-03-30 13:38
 **/
@Component
public class MongoServiceImpl implements MongoService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 设置User对象保存的collectionName,
     * 不指定collectionName保存,会默认使用对象名称,
     * 后面的CRUD操作中的collectionName均不为必填参数
     */
    private static final String userCollectionName = "myCollection";

    /**
     * 保存对象
     * @param user
     */
    @Override
    public void saveUser(User user) {
        //不指定collectionName保存,会默认使用对象名称
//        mongoTemplate.save(user);
        //指定collectionName保存
        mongoTemplate.save(user, userCollectionName);
    }

    /**
     * 条件查找
     * @param userName
     * @return
     */
    @Override
    public List<User> findUserByUserName(String userName) {
        Query query = new Query(Criteria.where("userName").is(userName));
        User one = mongoTemplate.findOne(query, User.class, userCollectionName);
        System.out.println("one:  " + one);
        List<User> users = mongoTemplate.find(query, User.class, userCollectionName);
        System.out.println("all:  " + users);
        return users;
    }

    /**
     * 修改更新对象
     * @param user
     */
    @Override
    public void updateUser(User user) {
        Query query = new Query(Criteria.where("id").is(user.getId()));
        Update update = new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
        //更新查询返回结果集的第一条
        mongoTemplate.updateFirst(query, update, User.class, userCollectionName);
        //更新查询返回结果集的所有
        mongoTemplate.updateFirst(query, update, User.class, userCollectionName);
    }

    /**
     * 删除对象
     * @param id
     */
    @Override
    public void deleteUserById(Long id) {
        Query query = new Query(Criteria.where("id").is(id));
        mongoTemplate.remove(query, User.class, userCollectionName);
    }

}

四 测试

package com.study.springboot.SpringBoot_A.cache;

import com.study.springboot.SpringBoot_A.SpringBootAApplication;
import com.study.springboot.SpringBoot_A.bean.User;
import com.study.springboot.SpringBoot_A.cache.mongodb.MongoService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 赵超
 * @Description
 * @create 2018-03-30 13:40
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SpringBootAApplication.class)
public class TestMongo {

    @Autowired
    private MongoService mongoService;

    @Test
    public void testSave() {
        User user = new User("username", "111222", "121@334.com", "zc", "2018-03-30");
        user.setId(1010l);
        mongoService.saveUser(user);
    }

    @Test
    public void testQuery() {
        String userName = "username";
        mongoService.findUserByUserName(userName);
    }

    @Test
    public void testUpdate() {
        User user = new User("newName", "66666", "121@334.com", "zc", "2018-03-30");
        user.setId(100l);
        mongoService.updateUser(user);
    }

    @Test
    public void testDelete() {
        mongoService.deleteUserById(100l);
    }

}

五 多数据源(并未自己测试)

在多mongodb数据源的情况下,我们换种更优雅的方式来实现

1、pom包配置

    添加lombok和spring-boot-autoconfigure包引用
    
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>RELEASE</version>
        </dependency>
Lombok – 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。简单试了以下这个工具还挺好玩的,加上注解我们就不用手动写 getter\setter、构建方式类似的代码了。
spring-boot-autoconfigure – 就是spring boot的自动化配置。

2、配置文件使用YAML的形式添加两条数据源,如下:

    mongodb:
      primary:
        host: 192.168.9.60
        port: 20000
        database: test
      secondary:
        host: 192.168.9.60
        port: 20000
        database: test1
        
3、配置两个库的数据源

    封装读取以mongodb开头的两个配置文件
    
    @Data
    @ConfigurationProperties(prefix = "mongodb")
    public class MultipleMongoProperties {
     
        private MongoProperties primary = new MongoProperties();
        private MongoProperties secondary = new MongoProperties();
    }
    
    配置不同包路径下使用不同的数据源
    
    第一个库的封装:
        @Configuration
        @EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
                mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
        public class PrimaryMongoConfig {
         
            protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
        }
        
    第二个库的封装:
        @Configuration
        @EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
                mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
        public class SecondaryMongoConfig {
         
            protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
        }
    
    读取对应的配置信息并且构造对应的MongoTemplate。

        @Configuration
        public class MultipleMongoConfig {
         
            @Autowired
            private MultipleMongoProperties mongoProperties;
         
            @Primary
            @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
            public MongoTemplate primaryMongoTemplate() throws Exception {
                return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
            }
         
            @Bean
            @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
            public MongoTemplate secondaryMongoTemplate() throws Exception {
                return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
            }
         
            @Bean
            @Primary
            public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
                return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                        mongo.getDatabase());
            }
         
            @Bean
            public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
                return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                        mongo.getDatabase());
            }
        }
    两个库的配置信息已经完成。

4、创建两个库分别对应的对象和Repository

    借助lombok来构建对象
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Document(collection = "first_mongo")
        public class PrimaryMongoObject {
         
            @Id
            private String id;
         
            private String value;
         
            @Override
            public String toString() {
                return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''
                        + '}';
            }
        }
    对应的Repository

        public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
        }
        继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码。
        
        Secondary和上面的代码类似就不贴出来了。

5、最后测试

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MuliDatabaseTest {
     
        @Autowired
        private PrimaryRepository primaryRepository;
     
        @Autowired
        private SecondaryRepository secondaryRepository;
     
        @Test
        public void TestSave() {
     
            System.out.println("************************************************************");
            System.out.println("测试开始");
            System.out.println("************************************************************");
     
            this.primaryRepository
                    .save(new PrimaryMongoObject(null, "第一个库的对象"));
     
            this.secondaryRepository
                    .save(new SecondaryMongoObject(null, "第二个库的对象"));
     
            List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();
            for (PrimaryMongoObject primary : primaries) {
                System.out.println(primary.toString());
            }
     
            List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();
     
            for (SecondaryMongoObject secondary : secondaries) {
                System.out.println(secondary.toString());
            }
     
            System.out.println("************************************************************");
            System.out.println("测试完成");
            System.out.println("************************************************************");
        }
     
    }
    到此,mongodb多数据源的使用已经完成。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值