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 输出设置 --> <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的资料请关注猪先飞其它相关文章!
原文出处:https://juejin.cn/post/7112725863082229767
相关文章
- 由于要使用mikoomi mongodb plugin插件,所以需要php对mongodb的扩展支持,默认通过源安装的php并没有mongodb的扩展支持,具体可以通过php -m|grep mongo 验证 。这里就结...2016-11-25
解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题
这篇文章主要介绍了解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 这篇文章主要介绍了详解springBoot启动时找不到或无法加载主类解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
- 这篇文章主要介绍了SpringBoot集成Redis实现消息队列的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
- 这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
Spring Boot项目@RestController使用重定向redirect方式
这篇文章主要介绍了Spring Boot项目@RestController使用重定向redirect方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-02- 这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
- 这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
安装使用Mongoose配合Node.js操作MongoDB的基础教程
这篇文章主要介绍了安装使用Mongoose来让Node.js操作MongoDB的基础教程,前端js+后端node+js操作MongoDB正是所谓最流行的一种JavaScript全栈开发方案,需要的朋友可以参考下...2016-03-03详解SpringBoot之访问静态资源(webapp...)
这篇文章主要介绍了详解SpringBoot之访问静态资源(webapp...),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-14- 这篇文章主要介绍了SpringBoot接口接收json参数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-19
springboot中使用@Transactional注解事物不生效的坑
这篇文章主要介绍了springboot中使用@Transactional注解事物不生效的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26- 这篇文章主要介绍了springboot多模块包扫描问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
- 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关...2013-09-11
修复 Mac brew 安装 mongodb 报 Error: No available formula with the name ‘mongodb’ 问题详解
最近在同事新的 Mac 电脑上安装 mongodb,报了错误 Error: No available formula with the name ‘mongodb’,今天就说说这个问题如何解决,需要的朋友可以参考下...2020-07-11Springboot+MDC+traceId日志中打印唯一traceId
本文主要介绍了Springboot+MDC+traceId日志中打印唯一traceId,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-17Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解
这篇文章主要介绍了Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-18- 这篇文章主要介绍了Springboot实现多线程注入bean的工具类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-27
SpringBoot部署到Linux读取resources下的文件及遇到的坑
本文主要给大家介绍SpringBoot部署到Linux读取resources下的文件,在平时业务开发过程中,很多朋友在获取到文件内容乱码或者文件读取不到的问题,今天给大家分享小编遇到的坑及处理方案,感兴趣的朋友跟随小编一起看看吧...2021-06-21