1. 程式人生 > >讓Mongo在Spring中跑起來

讓Mongo在Spring中跑起來

-s sts find wired repos Java實體類 remove criteria sprint

本文標題為《讓Mongo在Spring中跑起來》,旨在Spring中如何成功連接MongoDB並對其進行增刪改查等操作,由於筆者也是剛接觸,對其中的一些原由也不甚了解,若有錯誤之處,敬請指正。

  習慣了MySQL在Spring中整合時填寫各種各樣的連接參數,本來只想做一件簡單的數據庫插入查詢而已,翻遍整個互聯網通篇都是復制粘貼抄襲的配置,連接數的多少,超時時間的多少等等。

  SprintBoot的出現,秉持**約定大於配置**的目標,可以使你免去許多配置的煩腦,“約定”即是大多數人都這麽做,你這麽做估計也沒問題,反正就是能跑起來,你要用高級特性也可以也支持自定義配置。所以本文采用SpringBoot力求達到零XML配置。   不得不說,Spring如今已經成為Java EE事實上的標準,可以說Spring出品必屬精品,其中與數據庫打交道的部分,Spring也替我們做好了封裝,本文操作MongoDB的API不需要自己再在mongo-driver的基礎上再封裝一層,而是直接使用Spring提供的spring-data-mongo模塊,這個模塊加上SpringBoot的結合,淋漓盡致地展現了什麽叫做“約定大於配置”。   為了便於註入Bean,我們在maven中引入了以下兩個包:
<
dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId
> </dependency>
  SprintBoot的版本號為2.0.2.RELEASE。   為了驗證是否能對MongoDB進行操作,我們還需要再引入Spring的單元測試包:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency
>

  起初我想著,這應該需要配置MongoDB的地址、用戶名、密碼什麽的吧,所以我起初寫了一個配置類,企圖使用@Configuration的方式來配置MongoDB連接,後來發現,引入了spring-data-mongo在我們啟動SpringBoot時,已經為我們創建好了一個默認的MongoDB連接,不需要我們再去重復的配置(當然如果需要更高級的自定義配置也是可以自己配置的),只需要按照格式即可在啟動完成SpringBoot時,自動創建MongoDB連接。

  在application.properties中配置以下:
spring.data.mongodb.uri=mongodb://okevin:123456@localhost:27017/recommended
  即可通過SpringBoot自動為我們創建MongoDB連接,在代碼中直接引用MongoTemplate類。

  我們先通過MongoDB可視化管理Robo 3T連入對應的數據庫,並在數據庫中新創建一個MongoDB集合“user”,在代碼中需要我們創建一個與之對應的Java實體類User:

 1 package com.mongo.domain;
 2 
 3 import lombok.Data;
 4 import lombok.ToString;
 5 import org.springframework.data.annotation.Id;
 6 import org.springframework.data.mongodb.core.mapping.Document;
 7 import org.springframework.data.mongodb.core.mapping.Field;
 8 
 9 import java.io.Serializable;
10 
11 /**
12  * @author OKevin
13  * @description: MongoDB實體映射類
14  * @date 2019-01-06 12:10
15  */
16 @Data
17 @ToString
18 //以上兩個註解使用的是lombok,可減少代碼中getter/setter代碼
19 @Document(collection = "user") 
20 public class User implements Serializable {
21 
22     private static final long serialVersionUID = 5094995541812833015L;
23     /**
24      * 主鍵使用此註解
25      */
26     @Id
27     private String id;
28 
29     /**
30      * 字段使用此註解
31      */
32     @Field
33     private String name;
34 }
  User實體類對應MongoDB數據庫中的collection集合。   接下來就是操作MongoDB數據庫中user集合的一些增刪改查具體邏輯,很簡單只需要在類中註入MongoTemplate類即可。
 1 package com.mongo.dao;
 2 
 3 import com.mongo.domain.User;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.data.mongodb.core.MongoTemplate;
 6 import org.springframework.data.mongodb.core.query.Criteria;
 7 import org.springframework.data.mongodb.core.query.Query;
 8 import org.springframework.data.mongodb.core.query.Update;
 9 import org.springframework.stereotype.Component;
10 
11 import java.util.List;
12 
13 /**
14  * @author OKevin
15  * @description: 數據層操作類
16  * @date 2019-01-06 19:52
17  */
18 @Component
19 public class UserDao {
20 
21     @Autowired
22     private MongoTemplate mongoTemplate;
23 
24     /**
25      * 保存用戶
26      * @param user 返回保存的用戶
27      */
28     public void saveUser(User user) {
29         mongoTemplate.save(user);
30     }
31 
32     /**
33      * 根據名字查詢用戶
34      * @param name 名字
35      * @return 用戶
36      */
37     public List<User> findUserByName(String name) {
38         Query query = new Query(Criteria.where("name").is(name));
39         List<User> users = mongoTemplate.find(query, User.class);
40         return users;
41     }
42 
43     /**
44      * 更新用戶
45      * @param user 待更新的用戶
46      */
47     public void updateUser(User user) {
48         Query query = new Query(Criteria.where("id").is(user.getId()));
49         Update update = new Update().set("name", user.getName());
50         mongoTemplate.updateFirst(query, update, User.class);
51     }
52 
53     /**
54      * 根據MongoDB的_id刪除用戶
55      * @param Id _id
56      */
57     public void deleteUserById(String Id) {
58         Query query = new Query(Criteria.where("id").is(Id));
59         mongoTemplate.remove(query, User.class);
60     }
61 }
  最後是單元測試的代碼:
 1 package com.mongo;
 2 
 3 import com.mongo.dao.UserDao;
 4 import com.mongo.domain.User;
 5 import org.junit.Test;
 6 import org.junit.runner.RunWith;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.context.annotation.ComponentScan;
10 import org.springframework.test.context.ContextConfiguration;
11 import org.springframework.test.context.junit4.SpringRunner;
12 
13 import java.util.List;
14 
15 @RunWith(SpringRunner.class)
16 @SpringBootTest
17 public class SpringDataMongoDemoApplicationTests {
18 
19     @Autowired
20     private UserDao userDao;
21 
22     @Test
23     public void contextLoads() {
24     }
25 
26     @Test
27     public void testSaveUser() {
28         User user = new User();
29         user.setName("test");
30         userDao.saveUser(user);
31     }
32 
33     @Test
34     public void testFindUserByName() {
35         String name = "test";
36         List<User> users = userDao.findUserByName(name);
37         System.out.println(users);
38     }
39 
40     @Test
41     public void testUpdateUser() {
42         String id = "5c31f93f91ffb269a774b860";
43         User user = new User();
44         user.setId(id);
45         user.setName("test2");
46         userDao.updateUser(user);
47     }
48 
49     @Test
50     public void testDeleteUserById() {
51         String id = "5c31f93f91ffb269a774b860";
52         userDao.deleteUserById(id);
53     }
54 }
  執行單元測試運行正常,回到Robo 3T也發現執行成功。

  由此可見對於基本的一些操作,大可不必在Spring中配置一些MongoDB的連接,只需要一句配置提供地址、用戶名、密碼即可,軟件開發在學習特別是在初學的過程,讓一切先跑起來再說。

  本文涉及到的完整代碼已上傳至GitHub:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/%E8%AE%A9Mongo%E5%9C%A8Spring%E4%B8%AD%E8%B7%91%E8%B5%B7%E6%9D%A5/spring-data-mongo-demo。

這是一個能給程序員加buff的公眾號

技術分享圖片

讓Mongo在Spring中跑起來