公告:欢迎访问,查看更多资源请点我^.^!            点我关闭广告
SpringBoot_J~MongoDB
2018-05-31 18:16:44
904人阅读
评论(0)
分类:Java

一 引入依赖

<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多数据源的使用已经完成。
分享一下:
赞一下(1)
博主资料
博主头像
zc521106
文章:34
浏览:19899
文章分类
Java(12)
NoSql(112)
数据库(12)
前端(12)
阅读排行
Java基础知识
(12)
NoSql应用
(112)
数据库Oracle语法
(12)
前端常用工具类
(12)
java web项目
(12)
linux安装mysql
(12)
评论区
这篇文章怎么样?写点评论吧!
姓名:
邮箱:
有回复时通知我:
发表
回复【10.20.30.32】:
暂无评论,快抢沙发!
* 以上用户言论只代表其个人观点,不代表iBlog网站的观点或立场,如有任何疑问请随时联系管理员...