前段時間分享了關于Spring Boot中使用Redis的文章,除了Redis之后,我們在互聯(lián)網產品中還經常會用到另外一款著名的NoSQL數(shù)據(jù)庫MongoDB挽荠。
下面就來簡單介紹一下MongoDB,并且通過一個例子來介紹Spring Boot中對MongoDB訪問的配置和使用。
MongoDB簡介
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫内狗,它是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產品,其主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統(tǒng)的RDBMS系統(tǒng)(具有豐富的功能)之間架起一座橋梁义锥,它集兩者的優(yōu)勢于一身柳沙。
MongoDB支持的數(shù)據(jù)結構非常松散,是類似json的bson格式缨该,因此可以存儲比較復雜的數(shù)據(jù)類型偎行,也因為他的存儲格式也使得它所存儲的數(shù)據(jù)在Nodejs程序應用中使用非常流暢。
既然稱為NoSQL數(shù)據(jù)庫,Mongo的查詢語言非常強大蛤袒,其語法有點類似于面向對象的查詢語言熄云,幾乎可以實現(xiàn)類似關系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引妙真。
但是缴允,MongoDB也不是萬能的,同MySQL等關系型數(shù)據(jù)庫相比珍德,它們在針對不同的數(shù)據(jù)類型和事務要求上都存在自己獨特的優(yōu)勢练般。在數(shù)據(jù)存儲的選擇中,堅持多樣化原則锈候,選擇更好更經濟的方式薄料,而不是自上而下的統(tǒng)一化。
較常見的泵琳,我們可以直接用MongoDB來存儲鍵值對類型的數(shù)據(jù)摄职,如:驗證碼、Session等获列;由于MongoDB的橫向擴展能力谷市,也可以用來存儲數(shù)據(jù)規(guī)模會在未來變的非常巨大的數(shù)據(jù),如:日志击孩、評論等迫悠;由于MongoDB存儲數(shù)據(jù)的弱類型,也可以用來存儲一些多變json數(shù)據(jù)巩梢,如:與外系統(tǒng)交互時經常變化的JSON報文创泄。而對于一些對數(shù)據(jù)有復雜的高事務性要求的操作,如:賬戶交易等就不適合使用MongoDB來存儲且改。
訪問MongoDB
在Spring Boot中验烧,對如此受歡迎的MongoDB,同樣提供了自配置功能又跛。
引入依賴
Spring Boot中可以通過在pom.xml中加入spring-boot-starter-data-mongodb引入對mongodb的訪問支持依賴碍拆。它的實現(xiàn)依賴spring-data-mongodb。是的慨蓝,您沒有看錯感混,又是spring-data的子項目,之前介紹過spring-data-jpa礼烈、spring-data-redis弧满,對于mongodb的訪問,spring-data也提供了強大的支持此熬,下面就開始動手試試吧庭呜。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
快速開始使用Spring-data-mongodb
若MongoDB的安裝配置采用默認端口滑进,那么在自動配置的情況下,我們不需要做任何參數(shù)配置募谎,就能馬上連接上本地的MongoDB扶关。下面直接使用spring-data-mongodb來嘗試對mongodb的存取操作。(記得mongod啟動您的mongodb)
創(chuàng)建要存儲的User實體数冬,包含屬性:id节槐、username、age
public class User {
@Id
private Long id;
private String username;
private Integer age;
public User(Long id, String username, Integer age) {
this.id = id;
this.username = username;
this.age = age;
}
// 省略getter和setter
}
- 實現(xiàn)User的數(shù)據(jù)訪問對象:UserRepository
public interface UserRepository extends MongoRepository<User, Long> {
User findByUsername(String username);
}
- 在單元測試中調用
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
private UserRepository userRepository;
@Before
public void setUp() {
userRepository.deleteAll();
}
@Test
public void test() throws Exception {
// 創(chuàng)建三個User拐纱,并驗證User總數(shù)
userRepository.save(new User(1L, "didi", 30));
userRepository.save(new User(2L, "mama", 40));
userRepository.save(new User(3L, "kaka", 50));
Assert.assertEquals(3, userRepository.findAll().size());
// 刪除一個User铜异,再驗證User總數(shù)
User u = userRepository.findOne(1L);
userRepository.delete(u);
Assert.assertEquals(2, userRepository.findAll().size());
// 刪除一個User,再驗證User總數(shù)
u = userRepository.findByUsername("mama");
userRepository.delete(u);
Assert.assertEquals(1, userRepository.findAll().size());
}
}
參數(shù)配置
通過上面的例子秸架,我們可以輕而易舉的對MongoDB進行訪問揍庄,但是實戰(zhàn)中,應用服務器與MongoDB通常不會部署于同一臺設備之上咕宿,這樣就無法使用自動化的本地配置來進行使用币绩。這個時候,我們也可以方便的配置來完成支持府阀,只需要在application.properties中加入mongodb服務端的相關配置,具體示例如下:
spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test
在嘗試此配置時芽突,記得在mongo中對test庫創(chuàng)建具備讀寫權限的用戶(用戶名為name试浙,密碼為pass),不同版本的用戶創(chuàng)建語句不同寞蚌,注意查看文檔做好準備工作
若使用mongodb 2.x田巴,也可以通過如下參數(shù)配置,該方式不支持mongodb 3.x挟秤。
spring.data.mongodb.host=localhost spring.data.mongodb.port=27017