Springboot 整合 MongoDB
Springboot 整合 MongoDB
這節我們將整合 Spring Boot 與 Mongo DB 實現增刪改查的功能,並且實現序列遞增。
Mongo DB 的基本介紹和增刪改查的用法可以參考我之前的文章:MongoDB 的安裝和基本操作
新建一個 Spring Boot 項目,版本為 2.3.7.RELEASE,並引入如下依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
然後可以通過 Mongo Shell 或者 Navicat 工具創建一個名稱為 test 的資料庫,並新增 user 文檔(文檔,類似與關係型資料庫里的數據表):navicat 破解
在配置文件中配置 mongo 的連接資訊:
spring:
data:
mongodb:
host: localhost #地址
port: 27017 #埠號
database: test #資料庫名
Mongo DB 的默認埠為 27017,使用的資料庫為剛剛創建的 test。
創建 User 實體類:
@Document("User")
表示這是文檔對象,名稱為 User,對應 Mongo DB 里的 User 集合。@Id
標註主鍵欄位,String 類型的主鍵值在插入的時候 Mongo DB 會幫我們自動生成。如果對象中的某個屬性為非表欄位,可以使用註解@Transient
進行排除。
@Data
@Document("User")
public class User {
@Id
private String id;
private String name;
private Integer age;
}
MongoRepository
簡單增刪改查
創建一個 UserDao 介面:
@Repository
public interface UserDao extends MongoRepository<User, String> {
}
介面繼承自MongoRepository
,泛型分別為實體對象和主鍵類型。通過繼承MongoRepository
,UserDao
包含了一些增刪改查的方法,如下圖所示:
為了方便演示,接下來直接去到測試類進行測試:
記得注入 UserDao
import look.word.mongo.bean.User;
import look.word.mongo.dao.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest
class MongoDaoTest {
@Resource
private UserDao userDao;
/**
* 新增和修改都是 save方法,
* id 存在為修改,id 不存在為新增
*/
@Test
void save() {
User user = new User();
user.setName("張三");
user.setAge(18);
System.out.println(userDao.save(user));
userDao.save(user);
}
/**
* 刪除
*/
@Test
void remove(){
userDao.deleteById("62c155be562fb86d5bcce2d0");
}
/**
* 查詢所有
*/
@Test
void findAll(){
List<User> users = userDao.findAll();
users.stream().forEach(user -> System.out.println(user));
}
}
上面我們編寫了基本的增刪改查樣例,新增和修改都是通過save
方法完成的,當主鍵存在時則為修改,主鍵不存在則為新增。
測試新增用戶:
這裡沒有傳入 id 做的是新增
新增成功後 會返回當前插入的文檔對象
測試刪除用戶:
刪除成功後 沒有任何資訊的提示 這裡演示的是根據 id 去刪除
測試修改用戶:
- 可以看到 根據 id 修改時 會把我們不需要修改的值修改成 null 了 因為我們沒有傳入 如何避免呢?
- 可以先根據 id 查詢出文檔資訊 然後在修改需要修改的欄位即可。
測試查詢用戶:
多條件查詢:
Spring Data 提供了對 mongodb 數據訪問的支援,我們只需要繼承 MongoRepository 類,按照 Spring Data 規範就可以了
SpringData 方法定義規範
規則:
1、不是隨便聲明的,而需要符合一定的規範
2、 查詢方法以 find | read | get 開頭
3、 涉及條件查詢時,條件的屬性用條件關鍵字連接
4、 要注意的是:條件屬性首字母需要大寫
5、 支援屬性的級聯查詢,但若當前類有符合條件的屬性則優先使用,而不使用級聯屬性,若需要使用級聯屬性,則屬性之間使用_強制進行連接
比如通過用戶的年齡段來查詢:
注意: 方法參數個數需要和方法名中所需要的參數個數對應上。
@Repository
public interface UserDao extends MongoRepository<User, String> {
/**
* 根據年齡段來查找
*
* @param from from
* @param to to
* @return List<User>
*/
List<User> findByAgeBetween(Integer from, Integer to);
}
在輸入findBy
後,IDEA 會根據實體對象的屬性和 SQL 的各種關鍵字自動組合提示:
排序與分頁:
增刪改查
可以用MongoTemplate也可以實現
排序和分頁需要使用MongoTemplate
對象來完成,在UserService
里新增一個getUserByCondition
方法:
@Resource
private MongoTemplate mongoTemplate;
@Test
void getUserByCondition(){
// 查詢條件對象
Query query = new Query();
Criteria criteria = new Criteria();
Sort sort = Sort.by(Sort.Direction.DESC, "age");
//查詢第一頁 每頁1條 按照年齡升序
Pageable pageable = PageRequest.of(0, 10, sort);
// 模糊查詢
criteria.and("name").regex("三");
// 把查詢規則加入 查詢對象中
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query.with(pageable), User.class);
System.out.println(users);
}