­

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 破解

img

在配置文件中配置 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,泛型分別為實體對象和主鍵類型。通過繼承MongoRepositoryUserDao包含了一些增刪改查的方法,如下圖所示:

img

為了方便演示,接下來直接去到測試類進行測試:

記得注入 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 做的是新增

新增成功後 會返回當前插入的文檔對象

img

測試刪除用戶:

刪除成功後 沒有任何資訊的提示 這裡演示的是根據 id 去刪除

img

測試修改用戶:

  • 可以看到 根據 id 修改時 會把我們不需要修改的值修改成 null 了 因為我們沒有傳入 如何避免呢?
  • 可以先根據 id 查詢出文檔資訊 然後在修改需要修改的欄位即可。

img

測試查詢用戶:

img

多條件查詢:

Spring Data 提供了對 mongodb 數據訪問的支援,我們只需要繼承 MongoRepository 類,按照 Spring Data 規範就可以了

SpringData 方法定義規範

img

img

規則:

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

img

在輸入findBy後,IDEA 會根據實體對象的屬性和 SQL 的各種關鍵字自動組合提示:

img

排序與分頁:

增刪改查可以用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);
    }

img

Tags: