您好,欢迎访问一九零五行业门户网

SpringBoot MongoDB与MongoDB GridFS怎么使用

mongodb的基本使用添加依赖 <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-mongodb</artifactid> </dependency>
配置application.ymlserver: port: 8888spring: 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对象,用于打开下载流对象。
@configurationpublic 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怎么使用的详细内容。
其它类似信息

推荐信息