sprinboot之mongodb

  一、MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
  二、MongoDB常见使用场景用于处理文档的存放等,这样的目的主要是更加便于管理
  四、MongoDB的应用
  1)目录
  

  2)依赖包(pom.xml)

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.0.6.RELEASE</version>
        </dependency>
    </dependencies>

  3)需要用到的下载配置MongoConfiguration 

/**
 * file 文件处理配置
 */
@Configuration
public class MongoConfiguration {

    @Bean
    public GridFSBucket gridFSBucket(MongoDbFactory mongoDbFactory) {
        //主要是配置GridFSBuckets用于下载
        return GridFSBuckets.create(mongoDbFactory.getDb());
    }
}

  4)实现过程MongoServiceImpl 

@Service
@Transactional
public class MongoServiceImpl implements IMongoService {

    @Autowired
    private GridFsTemplate gridFsTemplate;

    @Autowired
    private GridFSBucket gridFSBucket;

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 上传文件
     * @param file
     * @return
     * @throws FileNotFoundException
     */
    @Override
    public String uploadFile(File file) throws FileNotFoundException {
        ObjectId objectId = gridFsTemplate.store(new FileInputStream(file), file.getName());
        return objectId.toHexString();
    }

    /**
     * 上传文件
     * @param inputStream
     * @param fileName
     * @return
     */
    @Override
    public String uploadFile(InputStream inputStream, String fileName) {
        ObjectId objectId = gridFsTemplate.store(inputStream, fileName);
        return objectId.toHexString();
    }

    /**
     * 下载文件
     * @param mongoId
     * @param outputStream
     */
    @Override
    public void downloadFile(String mongoId, OutputStream outputStream) throws IOException {
//        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(mongoId)));
//        GridFsResource gridFsResource = new GridFsResource(gridFSFile);
//        IOUtils.copy(gridFsResource.getInputStream(), outputStream);
        //上面这种方式也可以实现下载
        gridFSBucket.downloadToStream(new ObjectId(mongoId), outputStream);
    }

    /**
     * 删除文件
     * @param mongoId
     */
    @Override
    public void deleteFile(String mongoId) {
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is(mongoId)));
    }

    /**
     * 保存对象
     * @param t
     * @param <T>
     */
    @Override
    public <T> void save(T t) {
        mongoTemplate.save(t);
    }

    /**
     * 查询对象
     * @param query
     * @param clazz
     * @param <T>
     * @return
     */
    @Override
    public <T> List<T> find(Query query, Class<T> clazz) {
        return mongoTemplate.find(query, clazz);
    }

    /**
     * 查询单个对象
     * @param query
     * @param clazz
     * @param <T>
     * @return
     */
    @Override
    public <T> T findOne(Query query, Class<T> clazz) {
        return mongoTemplate.findOne(query, clazz);
    }

    /**
     * 删除对象
     * @param query
     * @param clazz
     * @param <T>
     */
    @Override
    public <T> void delete(Query query, Class<T> clazz) {
        mongoTemplate.findAndRemove(query, clazz);
    }

}

  说明:这里包含了两个部分,一个是文件,一个是对象的处理

  5)测试

  a、文件测试FileController

@RestController
@RequestMapping(value = "/file")
public class FileController {

    private Logger logger = LoggerFactory.getLogger(FileController.class);

    @Autowired
    private IMongoService mongoService;

    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    public ResultInfo uploadFile(MultipartFile multipartFile) {
        ResultInfo resultInfo = new ResultInfo();
        try {
            resultInfo.setData(mongoService.uploadFile(multipartFile.getInputStream(), multipartFile.getOriginalFilename()));
        } catch (Exception e) {
            logger.error("upload file error:", e);
            resultInfo.setStatus(false);
            resultInfo.setFailCode(e.getMessage());
        }
        return resultInfo;
    }

    @RequestMapping(value = "/downloadFile", method = RequestMethod.POST)
    public ResultInfo downloadFile(@RequestBody Map<String, Object> map, HttpServletResponse response) {
        ResultInfo resultInfo = new ResultInfo();
        try {
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition", "attachment;fileName=test.mp3");
            mongoService.downloadFile(map.get("mongoId").toString(), response.getOutputStream());
        } catch (Exception e) {
            logger.error("download file error:", e);
            resultInfo.setStatus(false);
            resultInfo.setFailCode(e.getMessage());
        }
        return resultInfo;
    }

    @RequestMapping(value = "/deleteFile", method = RequestMethod.POST)
    public ResultInfo deleteFile(@RequestBody Map<String, Object> map) {
        ResultInfo resultInfo = new ResultInfo();
        try {
            mongoService.deleteFile(map.get("mongoId").toString());
        } catch (Exception e) {
            logger.error("delete file error:", e);
            resultInfo.setStatus(false);
            resultInfo.setFailCode(e.getMessage());
        }
        return resultInfo;
    }
}

  b、对象测试

/**
 * 对象存储,测试
 */
@Component
public class MongoTask implements CommandLineRunner {

    @Autowired
    private IMongoService mongoService;

    @Override
    public void run(String... args) throws Exception {
        mongoService.save(new User(1L, "test1", 25));
        mongoService.save(new User(2L, "test2", 25));
        System.out.println(mongoService.find(Query.query(Criteria.where("name").regex("test")), User.class));
        System.out.println(mongoService.findOne(Query.query(Criteria.where("name").is("test2")), User.class));
        mongoService.delete(Query.query(Criteria.where("name").is("test2")), User.class);
    }
}

  五、源码地址:https://github.com/lilin409546297/spring-mongodb

 

 

posted @ 2019-03-08 18:10  小不点丶  阅读(365)  评论(0编辑  收藏  举报