首頁 > 軟體

SpringBoot MongoDB與MongoDB GridFS基本使用

2022-07-25 18:04:06

MongoDB的基本使用

新增依賴

	 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

設定application.yml

server:
  port: 8888
spring:
  application:
    name: dmeo-app
  data:
    mongodb:
      uri:  mongodb://root:123456@localhost:27017
      database: dmeo

設定啟動類

@SpringBootApplication
@EntityScan("cn.ybzy.model")//掃描實體類
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

設定紀錄檔

設定logback-spring.xml紀錄檔,非必要設定

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--定義紀錄檔檔案的儲存地址,使用絕對路徑-->
    <property name="LOG_HOME" value="D:/logs"/>
    <!-- Console 輸出設定 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:紀錄檔訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- 按照每天生成紀錄檔檔案 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--紀錄檔檔案輸出的檔名-->
            <fileNamePattern>${LOG_HOME}/xc.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 非同步輸出 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失紀錄檔.預設的,如果佇列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的紀錄檔 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改預設的佇列的深度,該值會影響效能.預設值為256 -->
        <queueSize>512</queueSize>
        <!-- 新增附加的appender,最多隻能新增一個 -->
        <appender-ref ref="FILE"/>
    </appender>
    <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
    </logger>
    <logger name="org.springframework.boot" level="DEBUG"/>
    <root level="info">
        <!--<appender-ref ref="ASYNC"/>-->
        <appender-ref ref="FILE"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

建立User檔案物件

@Data
@ToString
@Document(collection = "user")
public class User {
    @Id
    private String uid;
    private String name;
    private Integer age;
    private String address;
}

建立UserRepository

建立UserRepository ,繼承MongoRepository,並指定實體型別和主鍵型別

在MongoRepository中定義了很多現成的方法,可以更方便的使用。

Spring Data mongodb也提供了自定義方法的規則,按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等規則定義方法,實現查詢操作。

/**
 * @Author: CJ
 * @Description:
 **/
public interface UserRepository extends MongoRepository<User,String> {
    /**
     * 根據頁面名稱查詢
     * @param name
     * @return
     */
    User findByName(String name);
    /**
     * 根據頁面名稱和型別查詢
     * @param name
     * @param age
     * @return
     */
    User findByNameAndAge(String name,Integer age);
    /**
     * 根據站點和頁面型別查詢記錄數
     * @param name
     * @param age
     * @return
     */
    int countByNameAndAge(String name,Integer age);
    /**
     * 根據站點和頁面型別分頁查詢
     * @param name
     * @param address
     * @param pageable
     * @return
     */
    Page<User> findByNameAndAddress(String name, String address, Pageable pageable);
}

執行測試

@SpringBootTest
@RunWith(SpringRunner.class)
public class UserRepositoryTest {
    @Autowired
    private UserRepository userRepository;
    @Test
    public void testFindAll() {
        //從0開始
        int page = 0;
        int size = 10;
        Pageable pageable = PageRequest.of(page, size);
        Page<User> all = userRepository.findAll(pageable);
        System.out.println(all);
    }
    @Test
    public void testSave() {
        User user = new User();
        user.setName("lisi");
        user.setAddress("China");
        user.setAge(12);
        userRepository.save(user);
        System.out.println(user);
    }
    @Test
    public void testDelete() {
        userRepository.deleteById("5fce3a0728df2033145874fc");
    }
    @Test
    public void testUpdate() {
    	 /**
         * Optional是jdk1.8引入的型別,Optional是一個容器物件
         * 它包括了需要的物件,使用isPresent方法判斷所包含物件是否為空
         * isPresent方法返回false則表示Optional包含物件為空,否則可以使用get()取出物件進行操作。
         * Optional的優點是:
         *      1、提醒非空判斷。
         *      2、將物件非空檢測標準化。
         */
        Optional<User> optional = userRepository.findById("5fce3a0728df2033145874fc");
        if (optional.isPresent()) {
            User user = optional.get();
            user.setAge(22);
            userRepository.save(user);
        }
    }
    @Test
    public void testFindByName() {
        User user = userRepository.findByName("lisi");
        System.out.println(user);
    }
    @Test
    public void testCountByNameAndAge() {
        int count = userRepository.countByNameAndAge("lisi", 12);
        System.out.println(count);
    }
	//自定義條件查詢
	@Test
    public void testExample() {
        //條件值
        User user= new User ();
        user.setAge(22);
        user.setAddress("China");
        //條件匹配器
        ExampleMatcher exampleMatcher = ExampleMatcher.matching();
        //ExampleMatcher.GenericPropertyMatchers.contains() 包含關鍵字,即模糊查詢
        exampleMatcher = exampleMatcher.withMatcher("address",
                ExampleMatcher.GenericPropertyMatchers.contains());
        //建立條件範例
        Example<User> example = Example.of(user, exampleMatcher);
        //分頁物件
        Pageable pageable = new PageRequest(0, 10);
        //分頁查詢
        Page<User> UserList = cmsPageRepository.findAll(example, pageable);
        System.out.println(UserList);
    }
}

GridFS的基本使用

GridFS概述

GridFS是MongoDB提供的用於持久化儲存檔案的模組。

工作原理:

GridFS儲存檔案是將檔案分塊儲存,檔案會按照256KB的大小分割成多個塊進行儲存,GridFS使用兩個集合(collection)儲存檔案,一個集合是chunks, 用於儲存檔案的二進位制資料;一個集合是files,用於儲存檔案的後設資料資訊(檔名稱、塊大小、上傳時間等資訊)。

特點:

用於儲存和恢復超過16M(BSON檔案限制)的檔案(如:圖片、音訊、視訊等)

是檔案儲存的一種方式,但它是儲存在MonoDB的集合中

可以更好的儲存大於16M的檔案

會將大檔案物件分割成多個小的chunk(檔案片段),一般為256k/個,每個chunk將作為MongoDB的一個檔案(document)被儲存在chunks集合中

用兩個集合來儲存一個檔案:fs.files與fs.chunks

每個檔案的實際內容被存在chunks(二進位制資料)中,和檔案有關的meta資料(filename,content_type,還有使用者自定義的屬性)將會被存在files集合中。

詳細參考:官網檔案

存放檔案

	@Autowired
    GridFsTemplate gridFsTemplate;
    @Test
    public void testSaveFile() throws FileNotFoundException {
        //要儲存的檔案
        File file = new File("C:\Users\JackChen\Desktop\360截圖18141222225269.png");
        //定義輸入流
        FileInputStream inputStram = new FileInputStream(file);
        //向GridFS儲存檔案
        ObjectId objectId =  gridFsTemplate.store(inputStram, "1.png", "");
        //得到檔案ID
        String fileId = objectId.toString();
        //5fd46f5c3629763ad83f9b86
        System.out.println(fileId);
    }

檔案儲存成功得到一個檔案id,該檔案id是fs.files集合中的主鍵

可以通過檔案id查詢fs.chunks表中的記錄,得到檔案的內容。

當GridFS中讀取檔案時,若檔案分成多塊,需要對檔案的各分塊進行組裝、合併

讀取檔案

定義一個Mongodb的設定類,初始化專案時建立一個GridFSBucket物件,用於開啟下載流物件。

@Configuration
public class MongoConfig {
    @Value("${spring.data.mongodb.database}")
    String db;
    @Bean
    public GridFSBucket getGridFSBucket(MongoClient mongoClient){
        MongoDatabase database = mongoClient.getDatabase(db);
        GridFSBucket bucket = GridFSBuckets.create(database);
        return bucket;
    }
}
    @Test
    public void testReadFile() throws IOException {
        //根據檔案id查詢檔案
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
        //開啟一個下載流物件
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
        //建立GridFsResource物件,獲取流
        GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
        File file = new File("C:\Users\JackChen\Desktop\2.png");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        IOUtils.copy(gridFsResource.getInputStream(),fileOutputStream);
        fileOutputStream.close();
    }

刪除檔案

	@Autowired
    GridFsTemplate gridFsTemplate;
    @Test
    public void testDelFile() throws IOException {
        //根據檔案id刪除fs.files和fs.chunks中的記錄
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
    }

以上就是SpringBoot MongoDB與MongoDB GridFS基本使用的詳細內容,更多關於SpringBoot MongoDB GridFS的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com