spring boot 中的mongdb配置

1.如果不配置集羣那麼只需要配置pom文件然後在配置文件裏面添加鏈接名及密碼就可完成配置

pom.xml

配置pom包裏面添加spring-boot-starter-data-mongodb包引用

<dependencies>
    <dependency> 
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency> 
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在application.properties中添加配置

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test
  • 1

2.如果要配置多個IP集羣可以採用以下配置:

spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
  • 1

多數據源mongodb的使用

在多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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置不同包路徑下使用不同的數據源

第一個庫的封裝

@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
        mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
public class PrimaryMongoConfig {

    protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第二個庫的封裝

@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
        mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
public class SecondaryMongoConfig {

    protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

讀取對應的配置信息並且構造對應的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());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

兩個庫的配置信息已經完成。

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 + '\''
                + '}';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

對應的Repository

public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
}
  • 1
  • 2

繼承了 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("************************************************************");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

到此,mongodb多數據源的使用已經完成。

常用Api的方法:

新增方法:

User user = new User("...");
//將user對象保存到"user"這個collection中
mongoTemplate.save(user);
//將user對象保存到"new collection"這個collection中
mongoTemplate.save("new collection",user);
//將user對象保存到"user"這個collection中
mongoTemplate.insert(user);
//將user對象保存到"new collection"這個collection中
mongoTemplate.insert("new collection", user);
//將user的對象列表(List)保存到"user"collection中去
mongoTemplate.insertList(userInList);
//將user的對象列表(List)保存到"new collection"collection中去
mongoTemplate.insertList("new collection", userInList);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

另外請注意其中的save和insert的區別。它們的區別爲: 
1)save意思是,當記錄不存在時插入,或者是當記錄已存在是更新,實際上就是save or update的意思。 
2) insert的意思是:當記錄不存在時插入,而如果記錄存在時則忽略,繼續插入。

查詢方法:

//創建查詢條件 id = 123 和 name = zhangyu
Query query = new Query(Criteria.where("id").is(123).and("name").is("zhangyu"));
//執行查詢返回結果
List<User> user = mongoTemplate.find(query, User.class);
//創建查詢條件 id <= 123 和 name = zhangyu
Query query = new Query(Criteria.where("id").lte(123).and("name").is("zhangyu"));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

修改方法:

  Update update = new Update();
  Criteria criteria = new Criteria();
  criteria.and("name").is("張三");
  Query query = new Query(criteria); 
    mongoOperation.getCollection("").updateMulti(query.getQueryObject(),update.getUpdateObject());
  • 1
  • 2
  • 3
  • 4
  • 5

刪除方法:

User user = new User("...");
//刪除user集合中的user對象
mongoOperation.remove(user);
//刪除test集合下的id=2的user對象 
mongoOperation.remove("test", new Query(Criteria.where("id").is("2")));
//刪除test集合下的,id=3的user對象,最後並且返回這個被刪除的對象
User deletedUser = mongoOperation.findAndRemove("test",
new Query(Criteria.where("id").is("3")), User.class);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章