最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot MongoDB與MongoDB GridFS基本使用

 更新時(shí)間:2022年07月25日 16:06:17   作者:丨Jack_Chen丨  
這篇文章主要為大家介紹了SpringBoot MongoDB與MongoDB GridFS基本使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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

配置啟動(dòng)類

@SpringBootApplication
@EntityScan("cn.ybzy.model")//掃描實(shí)體類
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>
    <!--定義日志文件的存儲(chǔ)地址,使用絕對(duì)路徑-->
    <property name="LOG_HOME" value="D:/logs"/>
    <!-- Console 輸出設(shè)置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%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">
        <!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄TRACT、DEBUG、INFO級(jí)別的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一個(gè) -->
        <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>

創(chuàng)建User文檔對(duì)象

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

創(chuàng)建UserRepository

創(chuàng)建UserRepository ,繼承MongoRepository,并指定實(shí)體類型和主鍵類型

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

Spring Data mongodb也提供了自定義方法的規(guī)則,按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等規(guī)則定義方法,實(shí)現(xiàn)查詢操作。

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

執(zhí)行測(cè)試

@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是一個(gè)容器對(duì)象
         * 它包括了需要的對(duì)象,使用isPresent方法判斷所包含對(duì)象是否為空
         * isPresent方法返回false則表示Optional包含對(duì)象為空,否則可以使用get()取出對(duì)象進(jìn)行操作。
         * Optional的優(yōu)點(diǎn)是:
         *      1、提醒非空判斷。
         *      2、將對(duì)象非空檢測(cè)標(biāo)準(zhǔn)化。
         */
        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() 包含關(guān)鍵字,即模糊查詢
        exampleMatcher = exampleMatcher.withMatcher("address",
                ExampleMatcher.GenericPropertyMatchers.contains());
        //創(chuàng)建條件實(shí)例
        Example<User> example = Example.of(user, exampleMatcher);
        //分頁對(duì)象
        Pageable pageable = new PageRequest(0, 10);
        //分頁查詢
        Page<User> UserList = cmsPageRepository.findAll(example, pageable);
        System.out.println(UserList);
    }
}

GridFS的基本使用

GridFS概述

GridFS是MongoDB提供的用于持久化存儲(chǔ)文件的模塊。

工作原理:

GridFS存儲(chǔ)文件是將文件分塊存儲(chǔ),文件會(huì)按照256KB的大小分割成多個(gè)塊進(jìn)行存儲(chǔ),GridFS使用兩個(gè)集合(collection)存儲(chǔ)文件,一個(gè)集合是chunks, 用于存儲(chǔ)文件的二進(jìn)制數(shù)據(jù);一個(gè)集合是files,用于存儲(chǔ)文件的元數(shù)據(jù)信息(文件名稱、塊大小、上傳時(shí)間等信息)。

特點(diǎn):

用于存儲(chǔ)和恢復(fù)超過16M(BSON文件限制)的文件(如:圖片、音頻、視頻等)

是文件存儲(chǔ)的一種方式,但它是存儲(chǔ)在MonoDB的集合中

可以更好的存儲(chǔ)大于16M的文件

會(huì)將大文件對(duì)象分割成多個(gè)小的chunk(文件片段),一般為256k/個(gè),每個(gè)chunk將作為MongoDB的一個(gè)文檔(document)被存儲(chǔ)在chunks集合中

用兩個(gè)集合來存儲(chǔ)一個(gè)文件:fs.files與fs.chunks

每個(gè)文件的實(shí)際內(nèi)容被存在chunks(二進(jìn)制數(shù)據(jù))中,和文件有關(guān)的meta數(shù)據(jù)(filename,content_type,還有用戶自定義的屬性)將會(huì)被存在files集合中。

詳細(xì)參考:官網(wǎng)文檔

存放文件

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

文件存儲(chǔ)成功得到一個(gè)文件id,該文件id是fs.files集合中的主鍵

可以通過文件id查詢fs.chunks表中的記錄,得到文件的內(nèi)容。

當(dāng)GridFS中讀取文件時(shí),若文件分成多塊,需要對(duì)文件的各分塊進(jìn)行組裝、合并

讀取文件

定義一個(gè)Mongodb的配置類,初始化項(xiàng)目時(shí)創(chuàng)建一個(gè)GridFSBucket對(duì)象,用于打開下載流對(duì)象。

@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 {
        //根據(jù)文件id查詢文件
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
        //打開一個(gè)下載流對(duì)象
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
        //創(chuàng)建GridFsResource對(duì)象,獲取流
        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 {
        //根據(jù)文件id刪除fs.files和fs.chunks中的記錄
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
    }

以上就是SpringBoot MongoDB與MongoDB GridFS基本使用的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot MongoDB GridFS的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java使用BouncyCastle加密

    Java使用BouncyCastle加密

    本文主要介紹了Java使用BouncyCastle加密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringCloud Open feign 使用okhttp 優(yōu)化詳解

    SpringCloud Open feign 使用okhttp 優(yōu)化詳解

    這篇文章主要介紹了SpringCloud Open feign 使用okhttp 優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java分形繪制科赫雪花曲線(科赫曲線)代碼分享

    java分形繪制科赫雪花曲線(科赫曲線)代碼分享

    部分與整體以某種形式相似的形,稱為分形,科赫曲線是一種外形像雪花的幾何曲線,所以又稱為雪花曲線,它是分形曲線中的一種,畫法如下
    2013-12-12
  • mybatis plus怎么忽略映射字段

    mybatis plus怎么忽略映射字段

    這篇文章主要介紹了mybatis plus怎么忽略映射字段,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java中this與super關(guān)鍵字的使用方法

    java中this與super關(guān)鍵字的使用方法

    這篇文章主要介紹了java中this與super關(guān)鍵字的使用方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家徹底理解應(yīng)用java中this與super,需要的朋友可以參考下
    2017-09-09
  • kafka 重新分配partition和調(diào)整replica的數(shù)量實(shí)現(xiàn)

    kafka 重新分配partition和調(diào)整replica的數(shù)量實(shí)現(xiàn)

    當(dāng)需要提升Kafka集群的性能和負(fù)載均衡時(shí),可通過kafka-reassign-partitions.sh命令手動(dòng)重新分配Partition,增加節(jié)點(diǎn)后,可以將Topic的Partition的Leader節(jié)點(diǎn)均勻分布,以提高寫入和消費(fèi)速度,感興趣的可以了解一下
    2022-03-03
  • Java多線程之同步工具類CountDownLatch

    Java多線程之同步工具類CountDownLatch

    這篇文章主要介紹了Java多線程之同步工具類CountDownLatch,CountDownLatch是一個(gè)同步工具類,它允許一個(gè)或多個(gè)線程一直等待,直到其他線程執(zhí)行完后再執(zhí)行。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有框架服務(wù)之后執(zhí)行,下面一起來學(xué)習(xí)學(xué)習(xí)內(nèi)容吧
    2021-10-10
  • springboot中的css樣式顯示不出了的幾種情況

    springboot中的css樣式顯示不出了的幾種情況

    這篇文章主要介紹了springboot中的css樣式顯示不出了的幾種情況,具有很好的的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談springcloud gateway 連接保活問題

    淺談springcloud gateway 連接保活問題

    這篇文章主要介紹了springcloud gateway 連接?;顔栴},具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringMVC異常全局捕獲與錯(cuò)誤響應(yīng)的處理方法

    SpringMVC異常全局捕獲與錯(cuò)誤響應(yīng)的處理方法

    編程式異常處理是通過在代碼中?顯式編寫異常捕獲邏輯(如?try-catch?塊)來管理異常的方式,開發(fā)者需要手動(dòng)處理每一個(gè)可能拋出異常的代碼段,本文給大家介紹SpringMVC異常全局捕獲與錯(cuò)誤響應(yīng)的處理方法,感興趣的朋友一起看看吧
    2025-03-03

最新評(píng)論

五原县| 南澳县| 开江县| 靖江市| 新巴尔虎左旗| 台州市| 万年县| 郎溪县| 离岛区| 楚雄市| 神农架林区| 高安市| 屯留县| 明星| 昆山市| 忻城县| 五常市| 博爱县| 丰城市| 和田市| 台中市| 丽水市| 大港区| 西盟| 额尔古纳市| 平度市| 天峨县| 濮阳市| 象山县| 麻栗坡县| 平安县| 光山县| 肇东市| 深水埗区| 泸定县| 盐亭县| 宣恩县| 扎赉特旗| 牟定县| 昆山市| 辉县市|