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
配置啟動(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ù)頁(yè)面名稱查詢 * @param name * @return */ User findByName(String name); /** * 根據(jù)頁(yè)面名稱和類型查詢 * @param name * @param age * @return */ User findByNameAndAge(String name,Integer age); /** * 根據(jù)站點(diǎn)和頁(yè)面類型查詢記錄數(shù) * @param name * @param age * @return */ int countByNameAndAge(String name,Integer age); /** * 根據(jù)站點(diǎn)和頁(yè)面類型分頁(yè)查詢 * @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); //分頁(yè)對(duì)象 Pageable pageable = new PageRequest(0, 10); //分頁(yè)查詢 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)文章
關(guān)于idea的gitignore文件編寫及解決ignore文件不生效問題
這篇文章主要介紹了idea的gitignore文件編寫及解決ignore文件不生效問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java中CopyOnWriteArrayList的使用解析
這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場(chǎng)景里,比如緩存,它不存在擴(kuò)容的概念,每次寫操作都要復(fù)制一個(gè)副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下2023-12-12Java類加載之Class對(duì)象到Klass模型詳解
這篇文章主要介紹了Java類加載之Class對(duì)象到Klass模型詳解,每一個(gè)Java類在JVM中都會(huì)對(duì)應(yīng)創(chuàng)建一個(gè)C++類實(shí)例,我們稱這個(gè)C++類為Klass實(shí)例,Klass實(shí)例里面存儲(chǔ)了java類中所描述的方法、字段、屬性等,需要的朋友可以參考下2023-08-08Java微信公眾平臺(tái)開發(fā)(11) 微信三大平臺(tái)的關(guān)聯(lián)
這篇文章主要介紹了Java微信公眾平臺(tái)開發(fā)第十一步,微信開發(fā)中微信公眾平臺(tái)、開放平臺(tái)和商戶平臺(tái)的關(guān)聯(lián),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04基于java實(shí)現(xiàn)DFA算法代碼實(shí)例
這篇文章主要介紹了基于java實(shí)現(xiàn)DFA算法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09