SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。本文介紹SpringBoot整合之SpringBoot整合MongoDB的步驟。
一、創(chuàng)建項(xiàng)目,選擇依賴(lài)
僅選擇Spring Web、Spring Data MongoDB即可



二、引入相關(guān)依賴(lài)(非必要)
這里只是為了實(shí)體類(lèi)的創(chuàng)建方便而引入lombok
<!-- 引入lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
三、如果是第一次使用MongoDB,首先先創(chuàng)建用戶(hù)
> use admin
switched to db admin
> db.createUser({user:"zlfeng", pwd:"123456", roles:[{role:"readWriteAnyDatabase", db:"admin"}]});
Successfully added user: {
"user" : "zlfeng",
"roles" : [
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
]
}
MongoDB權(quán)限介紹
| 權(quán)限 | 說(shuō)明 |
|---|---|
| read | 允許用戶(hù)讀取指定數(shù)據(jù)庫(kù) |
| readWrite | 允許用戶(hù)讀寫(xiě)指定數(shù)據(jù)庫(kù) |
| dbAdmin | 允許用戶(hù)在指定數(shù)據(jù)庫(kù)中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除、查看統(tǒng)計(jì)或訪(fǎng)問(wèn)system.profile |
| userAdmin | 允許用戶(hù)向system.users集合寫(xiě)入,可以在指定數(shù)據(jù)庫(kù)中創(chuàng)建、刪除和管理用戶(hù) |
| clusterAdmin | 必須在admin數(shù)據(jù)庫(kù)中定義,賦予用戶(hù)所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限 |
| readAnyDatabase | 必須在admin數(shù)據(jù)庫(kù)中定義,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的讀權(quán)限 |
| readWriteAnyDatabase | 必須在admin數(shù)據(jù)庫(kù)中定義,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的讀寫(xiě)權(quán)限 |
| userAdminAnyDatabase | 必須在admin數(shù)據(jù)庫(kù)中定義,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的userAdmin權(quán)限 |
| dbAdminAnyDatabase | 必須在admin數(shù)據(jù)庫(kù)中定義,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的dbAdmin權(quán)限 |
| root | 必須在admin數(shù)據(jù)庫(kù)中定義,超級(jí)賬號(hào),超級(jí)權(quán)限 |
四、定義核心配置文件
# 登錄用戶(hù)所在的數(shù)據(jù)庫(kù) spring.data.mongodb.authentication-database=admin # 數(shù)據(jù)庫(kù)的ip地址 spring.data.mongodb.host=192.168.133.142 # MongoDB端口號(hào) spring.data.mongodb.port=27017 # 用戶(hù)賬號(hào) spring.data.mongodb.username=zlfeng # 用戶(hù)密碼 spring.data.mongodb.password=123456 # 指定使用的數(shù)據(jù)庫(kù) # 不必預(yù)先創(chuàng)建,不存在該數(shù)據(jù)庫(kù)會(huì)自動(dòng)創(chuàng)建 spring.data.mongodb.database=db_student
五、創(chuàng)建實(shí)體類(lèi)
package cn.byuan.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import java.io.Serializable;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Data
public class Student implements Serializable {
@Id// 必須指定id列
private String studentId;
private String studentName;
private Integer studentAge;
private Double studentScore;
private Date studentBirthday;
}
六、創(chuàng)建dao層,這里的dao層有兩種寫(xiě)法
(一)dao層寫(xiě)法一
1. 編碼部分
package cn.byuan.dao;
import cn.byuan.entity.Student;
import org.springframework.data.mongodb.repository.MongoRepository;
/*
* dao層寫(xiě)法一
* 這里的用法其實(shí)和SpringDataJPA相似, 可根據(jù)需要來(lái)自定義方法
*
* 這種寫(xiě)法不需要寫(xiě)實(shí)現(xiàn)類(lèi)
*
* MongoRepository<行對(duì)應(yīng)的對(duì)象類(lèi)型, 主鍵列類(lèi)型>
* */
public interface StudentDaoTypeOne extends MongoRepository<Student, String> {
// 可根據(jù)需求自己定義方法, 無(wú)需對(duì)方法進(jìn)行實(shí)現(xiàn)
Student getAllByStudentName(String studentName);
}

2.測(cè)試部分
在進(jìn)行測(cè)試之前,我們先查詢(xún)一下數(shù)據(jù)庫(kù),此時(shí)不存在db_student的庫(kù)

開(kāi)始測(cè)試
package cn.byuan;
import cn.byuan.dao.StudentDaoTypeOne;
import cn.byuan.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import java.util.List;
@SpringBootTest
class StudentDaoTypeOneTests {
@Autowired
private StudentDaoTypeOne studentDaoTypeOne;
@Test
void addOneStudent(){
// 插入10行
for (Integer count = 0; count < 10; count++) {
Student student = new Student()
.setStudentId("student_"+count) //如果自己不去設(shè)置id則系統(tǒng)會(huì)分配給一個(gè)id
.setStudentName("Godfery"+count)
.setStudentAge(count)
.setStudentScore(98.5-count)
.setStudentBirthday(new Date());
studentDaoTypeOne.save(student);
}
}
@Test
void deleteOneStudentByStudentId(){
// 刪除id為student_0的學(xué)生
studentDaoTypeOne.deleteById("student_0");
}
@Test
void updateOneStudent(){
// 修改姓名為Godfery1的Student年齡為22
Student student = studentDaoTypeOne.getAllByStudentName("Godfery1");
student.setStudentAge(22);
studentDaoTypeOne.save(student);
}
@Test
void getOneStudentByStudentId(){
System.out.println(studentDaoTypeOne.findById("student_1"));
}
@Test
void getAllStudent(){
List<Student> studentList = studentDaoTypeOne.findAll();
studentList.forEach(System.out::println);
}
}

我們先來(lái)查看一下數(shù)據(jù)庫(kù)

進(jìn)入數(shù)據(jù)庫(kù)查看一下數(shù)據(jù)

(二)dao層寫(xiě)法二
1.編碼部分
接口部分
package cn.byuan.dao;
import cn.byuan.entity.Student;
import java.util.List;
/*
* dao層寫(xiě)法二
*
* 寫(xiě)法二需要進(jìn)行實(shí)現(xiàn)
* */
public interface StudentDaoTypeTwo {
// 增加一位學(xué)生
void addOneStudent(Student student);
// 根據(jù)id刪除一位學(xué)生
void deleteOneStudentByStudentId(String studentId);
// 修改一位學(xué)生的信息
void updateOneStudent(Student student);
// 根據(jù)主鍵id獲取一名學(xué)生
Student getOneStudentByStudentId(String studentId);
// 獲取全部學(xué)生
List<Student> getAllStudent();
}
實(shí)現(xiàn)類(lèi)
package cn.byuan.dao.imp;
import cn.byuan.dao.StudentDaoTypeTwo;
import cn.byuan.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class StudentDaoTypeTwoImp implements StudentDaoTypeTwo {
// 使用MongoTemplate模板類(lèi)實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作
@Autowired
private MongoTemplate mongoTemplate;
// 增加一位學(xué)生
public void addOneStudent(Student student){
mongoTemplate.save(student);
}
// 根據(jù)id刪除一位學(xué)生
public void deleteOneStudentByStudentId(String studentId){
Student student = mongoTemplate.findById(studentId, Student.class);
if(student != null){
mongoTemplate.remove(student);
}
}
// 修改一位學(xué)生的信息
public void updateOneStudent(Student student){
mongoTemplate.save(student);
}
// 根據(jù)主鍵id獲取一名學(xué)生
public Student getOneStudentByStudentId(String studentId){
return mongoTemplate.findById(studentId, Student.class);
}
// 獲取全部學(xué)生
public List<Student> getAllStudent(){
return mongoTemplate.findAll(Student.class);
}
}
2.測(cè)試部分
package cn.byuan;
import cn.byuan.dao.StudentDaoTypeOne;
import cn.byuan.dao.StudentDaoTypeTwo;
import cn.byuan.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import java.util.List;
@SpringBootTest
class StudentDaoTypeTwoTests {
@Autowired
private StudentDaoTypeTwo studentDaoTypeTwo;
@Test
void addOneStudent(){
// 插入10行
for (Integer count = 0; count < 10; count++) {
Student student = new Student()
.setStudentId("study_"+count) //如果自己不去設(shè)置id則系統(tǒng)會(huì)分配給一個(gè)id
.setStudentName("Echo"+count)
.setStudentAge(count)
.setStudentScore(98.5-count)
.setStudentBirthday(new Date());
studentDaoTypeTwo.addOneStudent(student);
}
}
@Test
void deleteOneStudentByStudentId(){
// 刪除id為study_0的學(xué)生
studentDaoTypeTwo.deleteOneStudentByStudentId("study_0");
}
@Test
void updateOneStudent(){
// 修改id為study_1的Student年齡為21
Student student = studentDaoTypeTwo.getOneStudentByStudentId("study_1");
student.setStudentAge(21);
studentDaoTypeTwo.updateOneStudent(student);
}
@Test
void getOneStudentByStudentId(){
System.out.println(studentDaoTypeTwo.getOneStudentByStudentId("study_1"));
}
@Test
void getAllStudent(){
List<Student> studentList = studentDaoTypeTwo.getAllStudent();
studentList.forEach(System.out::println);
}
}

進(jìn)入數(shù)據(jù)庫(kù)查看一下數(shù)據(jù)

源碼地址:https://github.com/byuan98/springboot-integration/tree/master/test008_springboot_mongodb
到此這篇關(guān)于SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)SpringBoot整合MongoDB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
到此這篇關(guān)于SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)SpringBoot整合MongoDB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis的xml中使用if/else標(biāo)簽的具體使用
本文主要介紹了Mybatis的xml中使用if/else標(biāo)簽的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Java使用觀(guān)察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例
這篇文章主要介紹了Java使用觀(guān)察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能,結(jié)合完整實(shí)例形式分析了java觀(guān)察者模式實(shí)現(xiàn)氣象局高溫預(yù)警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設(shè)計(jì)原則與適用場(chǎng)合,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04
JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)方法
這篇文章主要給大家介紹了關(guān)于JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的相關(guān)資料, GUI是指圖形用戶(hù)界面,指采用圖形方式顯示的計(jì)算機(jī)操作用戶(hù)界面,需要的朋友可以參考下2023-07-07
詳解IDEA2020新建spring項(xiàng)目和c3p0連接池的創(chuàng)建和使用
C3P0是一個(gè)開(kāi)源的JDBC連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,本文就使用Spring實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Java實(shí)現(xiàn)文件切割拼接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java實(shí)現(xiàn)文件切割拼接的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Java使用正則表達(dá)式判斷獨(dú)立字符的存在(代碼示例)
通過(guò)使用正則表達(dá)式,我們可以更加靈活地判斷字符串中是否包含特定的字符,并且可以控制匹配的條件,如獨(dú)立的字符,這為我們處理字符串提供了更多的選擇和功能,這篇文章主要介紹了Java使用正則表達(dá)式判斷獨(dú)立字符的存在,需要的朋友可以參考下2023-10-10

