MongoDB
在企業(yè)級(jí)項(xiàng)目中一般用于存儲(chǔ)文檔信息、圖片資源等,MongoDB
的內(nèi)容完全是以 JSON
字符串的形式進(jìn)行存儲(chǔ)的,所以我們?cè)讷@取數(shù)據(jù)時(shí)通過簡(jiǎn)單的 反序列化
就可以完成與項(xiàng)目?jī)?nèi)的實(shí)體類轉(zhuǎn)換,不過這個(gè)過程是自動(dòng)的,不需要我們手動(dòng)進(jìn)行反序列化處理。
免費(fèi)教程專題
恒宇少年在博客整理三套免費(fèi)學(xué)習(xí)教程專題
,由于文章偏多
特意添加了閱讀指南
,新文章以及之前的文章都會(huì)在專題內(nèi)陸續(xù)填充
,希望可以幫助大家解惑更多知識(shí)點(diǎn)。
本章目標(biāo)
完成簡(jiǎn)單的SpringBoot
與MongoDB
的自動(dòng)化整合,讓我們像是使用spring-data-jpa
的形式來完成MongoDB
的數(shù)據(jù)操作。
為你推薦
- 第四十七章:SpringBoot2.0新特性 - Quartz自動(dòng)化配置集成
- 第四十八章:SpringBoot2.0新特性 - RabbitMQ信任package設(shè)置
- 第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer兩種配置方式了嗎?
- 第五十章:SpringBoot2.0新特性 - 豈止至今最簡(jiǎn)單redis緩存集成
SpringBoot 企業(yè)級(jí)核心技術(shù)學(xué)習(xí)專題
專題 | 專題名稱 | 專題描述 |
---|---|---|
001 | Spring Boot 核心技術(shù) | 講解SpringBoot一些企業(yè)級(jí)層面的核心組件 |
002 | Spring Boot 核心技術(shù)章節(jié)源碼 | Spring Boot 核心技術(shù)簡(jiǎn)書每一篇文章碼云對(duì)應(yīng)源碼 |
003 | Spring Cloud 核心技術(shù) | 對(duì)Spring Cloud核心技術(shù)全面講解 |
004 | Spring Cloud 核心技術(shù)章節(jié)源碼 | Spring Cloud 核心技術(shù)簡(jiǎn)書每一篇文章對(duì)應(yīng)源碼 |
005 | QueryDSL 核心技術(shù) | 全面講解QueryDSL核心技術(shù)以及基于SpringBoot整合SpringDataJPA |
006 | SpringDataJPA 核心技術(shù) | 全面講解SpringDataJPA核心技術(shù) |
007 | SpringBoot核心技術(shù)學(xué)習(xí)目錄 | SpringBoot系統(tǒng)的學(xué)習(xí)目錄,敬請(qǐng)關(guān)注點(diǎn)贊!!! |
準(zhǔn)備MongDB
我們使用MongoDB
官方提供的安裝方式進(jìn)行安裝,下面是對(duì)應(yīng)系統(tǒng)的官方安裝文檔:
創(chuàng)建用戶
我們需要?jiǎng)?chuàng)建一個(gè)用戶,用于本章的使用,如果你是OSX
系統(tǒng),只需要打開終端輸入mongo
命令就可以進(jìn)入MongoDB
的管理界面。
1. 創(chuàng)建數(shù)據(jù)庫
使用 use test; 命令可以創(chuàng)建一個(gè)名為`test`的數(shù)據(jù)庫
2. 創(chuàng)建數(shù)據(jù)庫所有者角色的用戶
db.createUser(
{
user: "test",
pwd: "123456",
roles: [ { role: "dbOwner", db: "test" } ]
}
);
用戶創(chuàng)建完成后就可以進(jìn)行本章的編碼了,環(huán)境有了之后我們接下來需要進(jìn)行環(huán)境的連接進(jìn)行操作數(shù)據(jù)。
構(gòu)建項(xiàng)目
我們使用IDEA
創(chuàng)建一個(gè)新的SpringBoot
項(xiàng)目,在pom.xml
配置文件內(nèi)添加我們本章所需要的依賴,如下所示:
<dependencies>
<!--mongodb依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--lombok依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--fastjson依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
<!--測(cè)試依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
根據(jù)mongodb
的依賴我們可以看到Spring
家族式的設(shè)計(jì),把所有操作數(shù)據(jù)的依賴都進(jìn)行歸類到spring-boot-starter-data-xxx
下,我們比較常用到的如:spring-boot-starter-data-jpa
、spring-boot-starter-data-redis
等。
MongoRepository
spring-boot-starter-data-mongodb
確實(shí)采用了跟spring-boot-starter-data-jpa
同樣的方式來完成接口代理類的生成,并且提供了一些常用的單個(gè)對(duì)象操作的公共方法,MongoRepository
接口作用與JPARepository
一致,繼承了該接口的業(yè)務(wù)數(shù)據(jù)接口
就可以提供一個(gè)被Spring IOC
托管的代理實(shí)現(xiàn)類,這樣我們?cè)谧⑷?code>業(yè)務(wù)數(shù)據(jù)接口時(shí)就會(huì)完成代理實(shí)現(xiàn)類的注入。
廢話不多說了,下面我們直接來創(chuàng)建一個(gè)名為CustomerRepository
的數(shù)據(jù)接口,該接口繼承MongoRepository<T,PK>
,如下所示:
/**
* 客戶數(shù)據(jù)接口
* 繼承自MongoRepository接口
*
* @author:于起宇 <br/>
* ===============================
* Created with IDEA.
* Date:2018/3/28
* Time:下午7:41
* 簡(jiǎn)書:http://www.lxweimin.com/u/092df3f77bca
* ================================
*/
public interface CustomerRepository extends MongoRepository<Customer, String> {
}
MongoRepository <T,PK>
同樣也是采用了兩個(gè)泛型參數(shù),
T
:實(shí)體類類型。
PK
:T
實(shí)體類內(nèi)的主鍵類型,如:String。
自定義實(shí)體類
我們?cè)?code>CustomerRepository接口內(nèi)使用了Customer
實(shí)體類作為泛型參數(shù),下面我們簡(jiǎn)單創(chuàng)建Customer
實(shí)體類,內(nèi)容如下所示:
@Data
public class Customer implements Serializable {
/**
* 客戶編號(hào)
*/
@Id
public String id;
/**
* 客戶名稱
*/
public String firstName;
/**
* 客戶姓氏
*/
public String lastName;
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
同樣我們需要通過@Id
注解進(jìn)行設(shè)置主鍵,不過這個(gè)主鍵的值是MongoDB
自動(dòng)生成的,生成的主鍵值是具有唯一性的。
添加配置
代碼已經(jīng)準(zhǔn)備好了,我們只需要添加MongoDB
的一些配置信息就大功告成了,下面我們需要在application.yml
配置文件內(nèi)添加如下配置:
spring:
application:
name: spring-boot-mongodb
data:
mongodb:
uri: mongodb://localhost/test
username: test
password: 123456
在上面配置的uri
內(nèi)的test
即為數(shù)據(jù)庫的名稱,username
配置我們自定義的用戶名稱,password
配置為自定義用戶設(shè)置的密碼。
上面我們的代碼已經(jīng)全部編寫完成,接下來我們需要進(jìn)行測(cè)試,來查看我們的CustomerRepository
是否已經(jīng)生效.
測(cè)試
我們使用CommandLineRunner
接口進(jìn)行簡(jiǎn)單的項(xiàng)目運(yùn)行后就執(zhí)行Customer
文檔內(nèi)的數(shù)據(jù)操作,修改Chapter51Application
入口類,添加CommandLineRunner
接口的實(shí)現(xiàn),如下所示:
/**
* 程序入口類
* @author yuqiyu
*/
@SpringBootApplication
public class Chapter51Application implements CommandLineRunner {
/**
* logger instance
*/
static Logger logger = LoggerFactory.getLogger(Chapter51Application.class);
/**
* 客戶數(shù)據(jù)接口注入
*/
@Autowired
private CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(Chapter51Application.class, args);
logger.info("【【【【【SpringBoot整合Mongodb啟動(dòng)完成.】】】】】");
}
@Override
public void run(String... args) {
// 刪除全部
repository.deleteAll();
// 添加一條數(shù)據(jù)
repository.save(new Customer("于", "起宇"));
// 查詢?nèi)? logger.info(JSON.toJSONString(repository.findAll()));
}
}
在run
方法內(nèi)
- 刪除了
Customer
文檔內(nèi)的全部?jī)?nèi)容 - 執(zhí)行了保存數(shù)據(jù)的操作
- 查詢出本次保存的數(shù)據(jù)內(nèi)容
下面我們來運(yùn)行下程序查看控制臺(tái)的效果,如下所示:
[{"firstName":"于","id":"5ad4be1cab73ac0bdc23bd9a","lastName":"起宇"}]
【【【【【SpringBoot整合Mongodb啟動(dòng)完成.】】】】】
已經(jīng)可以正常的輸出了MongoDB
我們添加到文檔內(nèi)的數(shù)據(jù),在上面說到了id
這個(gè)字段的特殊性,這是個(gè)分布式唯一性的字段值,是一個(gè)短板的md5
格式的字符串。
修改默認(rèn)掃描路徑
如果你不打算使用SpringBoot
默認(rèn)的掃描路徑(SpringBoot
默認(rèn)掃描XxxApplication
類的同級(jí)以及所有子級(jí)的package
)可以通過@EnableMongoRepositories
注解配置basePackages
屬性完成自定義的MongoDB
的MongoRepository
實(shí)現(xiàn)類的掃描,如下所示:
@SpringBootApplication
@EnableMongoRepositories(basePackages = "com.hengyu.chapter51")
public class Chapter51Application implements CommandLineRunner { }
總結(jié)
本章簡(jiǎn)單的講解了SpringBoot
集成MongoDB
,它與JPA
有著同樣的數(shù)據(jù)操作方式,數(shù)據(jù)接口通過繼承MongoRepository
就可以讓我們可以使用與JPA
相同的方法進(jìn)行操作MongoDB
文檔內(nèi)的數(shù)據(jù),從而減少了學(xué)習(xí)的成本。
本章源碼已經(jīng)上傳到碼云:
SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter