讓Mongo在Spring中跑起來

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

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

  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鏈接。git

  在 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

  本文涉及到的完整代碼已上傳至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-demoweb

 

 

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

相關文章
相關標籤/搜索