SpringBoot整合MongoDB

一、建立專案,選擇依賴

僅選擇Spring Web、Spring Data MongoDB即可





二、引入相關依賴(非必要)

這裡只是為了實體類的建立方便而引入lombok

<!-- 引入lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

三、如果是第一次使用MongoDB,首先先建立使用者

> 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許可權介紹

許可權 說明
read 允許使用者讀取指定資料庫
readWrite 允許使用者讀寫指定資料庫
dbAdmin 允許使用者在指定資料庫中執行管理函式,如索引建立、刪除、檢視統計或訪問system.profile
userAdmin 允許使用者向system.users集合寫入,可以在指定資料庫中建立、刪除和管理使用者
clusterAdmin 必須在admin資料庫中定義,賦予使用者所有分片和複製集相關函式的管理許可權
readAnyDatabase 必須在admin資料庫中定義,賦予使用者所有資料庫的讀許可權
readWriteAnyDatabase 必須在admin資料庫中定義,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase 必須在admin資料庫中定義,賦予使用者所有資料庫的userAdmin許可權
dbAdminAnyDatabase 必須在admin資料庫中定義,賦予使用者所有資料庫的dbAdmin許可權
root 必須在admin資料庫中定義,超級賬號,超級許可權

四、定義核心配置檔案

# 登入使用者所在的資料庫
spring.data.mongodb.authentication-database=admin # 資料庫的ip地址
spring.data.mongodb.host=192.168.133.142 # MongoDB埠號
spring.data.mongodb.port=27017 # 使用者賬號
spring.data.mongodb.username=zlfeng # 使用者密碼
spring.data.mongodb.password=123456 # 指定使用的資料庫
# 不必預先建立,不存在該資料庫會自動建立
spring.data.mongodb.database=db_student

五、建立實體類

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;
}

六、建立dao層,這裡的dao層有兩種寫法

(一)dao層寫法一

1. 編碼部分

package cn.byuan.dao;

import cn.byuan.entity.Student;
import org.springframework.data.mongodb.repository.MongoRepository; /*
* dao層寫法一
* 這裡的用法其實和SpringDataJPA相似, 可根據需要來自定義方法
*
* 這種寫法不需要寫實現類
*
* MongoRepository<行對應的物件型別, 主鍵列型別>
* */
public interface StudentDaoTypeOne extends MongoRepository<Student, String> { // 可根據需求自己定義方法, 無需對方法進行實現
Student getAllByStudentName(String studentName); }

2.測試部分

在進行測試之前,我們先查詢一下資料庫,此時不存在db_student的庫

開始測試

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) //如果自己不去設定id則系統會分配給一個id
.setStudentName("Godfery"+count)
.setStudentAge(count)
.setStudentScore(98.5-count)
.setStudentBirthday(new Date());
studentDaoTypeOne.save(student);
}
} @Test
void deleteOneStudentByStudentId(){
// 刪除id為student_0的學生
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);
} }

我們先來檢視一下資料庫

進入資料庫檢視一下資料

(二)dao層寫法二

1.編碼部分

介面部分

package cn.byuan.dao;

import cn.byuan.entity.Student;

import java.util.List;

/*
* dao層寫法二
*
* 寫法二需要進行實現
* */
public interface StudentDaoTypeTwo {
// 增加一位學生
void addOneStudent(Student student); // 根據id刪除一位學生
void deleteOneStudentByStudentId(String studentId); // 修改一位學生的資訊
void updateOneStudent(Student student); // 根據主鍵id獲取一名學生
Student getOneStudentByStudentId(String studentId); // 獲取全部學生
List<Student> getAllStudent();
}

實現類

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模板類實現資料庫操作
@Autowired
private MongoTemplate mongoTemplate; // 增加一位學生
public void addOneStudent(Student student){
mongoTemplate.save(student); } // 根據id刪除一位學生
public void deleteOneStudentByStudentId(String studentId){
Student student = mongoTemplate.findById(studentId, Student.class);
if(student != null){
mongoTemplate.remove(student);
} } // 修改一位學生的資訊
public void updateOneStudent(Student student){
mongoTemplate.save(student);
} // 根據主鍵id獲取一名學生
public Student getOneStudentByStudentId(String studentId){
return mongoTemplate.findById(studentId, Student.class);
} // 獲取全部學生
public List<Student> getAllStudent(){
return mongoTemplate.findAll(Student.class);
}
}

2.測試部分

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) //如果自己不去設定id則系統會分配給一個id
.setStudentName("Echo"+count)
.setStudentAge(count)
.setStudentScore(98.5-count)
.setStudentBirthday(new Date());
studentDaoTypeTwo.addOneStudent(student);
}
} @Test
void deleteOneStudentByStudentId(){
// 刪除id為study_0的學生
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);
} }

進入資料庫檢視一下資料

原始碼地址:https://github.com/byuan98/springboot-integration/tree/master/test008_springboot_mongodb