<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
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>
@Data @ToString @Document(collection = "user") public class User { @Id private String uid; private String name; private Integer age; private String address; }
建立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是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其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45