SpringBoot MongoDB與MongoDB GridFS基本使用
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 輸出設(shè)置 -->
<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>
創(chuàng)建User文檔對象
@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,并指定實體類型和主鍵類型
在MongoRepository中定義了很多現(xiàn)成的方法,可以更方便的使用。
Spring Data mongodb也提供了自定義方法的規(guī)則,按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等規(guī)則定義方法,實現(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ù)站點和頁面類型查詢記錄數(shù)
* @param name
* @param age
* @return
*/
int countByNameAndAge(String name,Integer age);
/**
* 根據(jù)站點和頁面類型分頁查詢
* @param name
* @param address
* @param pageable
* @return
*/
Page<User> findByNameAndAddress(String name, String address, Pageable pageable);
}
執(zhí)行測試
@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的優(yōu)點是:
* 1、提醒非空判斷。
* 2、將對象非空檢測標(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)建條件實例
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, 用于存儲文件的二進制數(shù)據(jù);一個集合是files,用于存儲文件的元數(shù)據(jù)信息(文件名稱、塊大小、上傳時間等信息)。
特點:
用于存儲和恢復(fù)超過16M(BSON文件限制)的文件(如:圖片、音頻、視頻等)
是文件存儲的一種方式,但它是存儲在MonoDB的集合中
可以更好的存儲大于16M的文件
會將大文件對象分割成多個小的chunk(文件片段),一般為256k/個,每個chunk將作為MongoDB的一個文檔(document)被存儲在chunks集合中
用兩個集合來存儲一個文件:fs.files與fs.chunks
每個文件的實際內(nèi)容被存在chunks(二進制數(shù)據(jù))中,和文件有關(guān)的meta數(shù)據(jù)(filename,content_type,還有用戶自定義的屬性)將會被存在files集合中。
詳細參考:官網(wǎng)文檔
存放文件

@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表中的記錄,得到文件的內(nèi)容。
當(dāng)GridFS中讀取文件時,若文件分成多塊,需要對文件的各分塊進行組裝、合并

讀取文件
定義一個Mongodb的配置類,初始化項目時創(chuàng)建一個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 {
//根據(jù)文件id查詢文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
//打開一個下載流對象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
//創(chuàng)建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 {
//根據(jù)文件id刪除fs.files和fs.chunks中的記錄
gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
}

以上就是SpringBoot MongoDB與MongoDB GridFS基本使用的詳細內(nèi)容,更多關(guān)于SpringBoot MongoDB GridFS的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud Open feign 使用okhttp 優(yōu)化詳解
這篇文章主要介紹了SpringCloud Open feign 使用okhttp 優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
kafka 重新分配partition和調(diào)整replica的數(shù)量實現(xiàn)
當(dāng)需要提升Kafka集群的性能和負載均衡時,可通過kafka-reassign-partitions.sh命令手動重新分配Partition,增加節(jié)點后,可以將Topic的Partition的Leader節(jié)點均勻分布,以提高寫入和消費速度,感興趣的可以了解一下2022-03-03
SpringMVC異常全局捕獲與錯誤響應(yīng)的處理方法
編程式異常處理是通過在代碼中?顯式編寫異常捕獲邏輯(如?try-catch?塊)來管理異常的方式,開發(fā)者需要手動處理每一個可能拋出異常的代碼段,本文給大家介紹SpringMVC異常全局捕獲與錯誤響應(yīng)的處理方法,感興趣的朋友一起看看吧2025-03-03

