本文標題為《讓Mongo在Spring中跑起來》,旨在Spring中如何成功連接MongoDB並對其進行增刪改查等操作,由於筆者也是剛接觸,對其中的一些原由也不甚瞭解,若有錯誤之處,敬請指正。 習慣了MySQL在Spring中整合時填寫各種各樣的連接參數,本來只想做一件簡單的資料庫插入查詢而已 ...
本文標題為《讓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的公眾號