NoSQL + MongoDB + springBoot 2.0.3 + thymeleaf 开发文件服务器

NoSQL 简介

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数

主要特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

前面小编我简单摘要关于什么是NoSQL 和 MongoDB 简介与关系

  • 下面我们就开始MongoDB + springBoot 2.0.3开发文件服务器
  • 既然是基于Springboot2.0.3开发开发文件服务器 ,那我们肯定第一搭建开发环境

   application.yml 文件中配置参数

#server 上下文路径

server:

  port: 8989

  address: 127.0.0.1

#配置thymeleaf

spring:

  thymeleaf:

    encoding:  UTF-8

    cache: false

    mode: HTML5

#分割文件上载大小

  servlet:

    multipart:

      max-file-size: 1024KB

      max-request-size: 1024KB

# 自定义独立配置 MongoDB 服务

#  data:

#    mongodb:

#      uri: http://localhost:27017                                                                                                                                                                     

pom.xml 添加依赖

                   <!-- 添加 Spring Data Mongodb 的依赖 -->

                   <dependency>

                            <groupId>org.springframework.boot</groupId>

                            <artifactId>spring-boot-starter-data-mongodb</artifactId>

                   </dependency>

                   <!-- 添加 Embedded MongoDB 的依赖用于测试 -->

                   <dependency>

                            <groupId>de.flapdoodle.embed</groupId>

                            <artifactId>de.flapdoodle.embed.mongo</artifactId>

                            <scope>test</scope>

                   </dependency>

                   <!-- 添加 Thymeleaf 的依赖 -->

                   <dependency>

                            <groupId>org.springframework.boot</groupId>

                            <artifactId>spring-boot-starter-thymeleaf</artifactId>

                   </dependency>                                                                                                                                                                          

 构建文件对象的实体类

/**

 * File 文档类.

 * @author Administrator

 * <br>

 *注意:这里是非关系数据库 NoSQL 建立映射实体的对象

 */

@Document

@Data  // lombok.Data; 包含了一系列 getter,setter,toString 方法

public class File {

         /**

          * @param id                                                       主键

          * @param name                                文件名称

          * @param contentType    文件类型

          * @param size                                            文件大小

          * @param uploadDate               上载日期

          * @param md5     md5            加密

          * @param content                    文件内容

          * @param path                                 文件路径

          */  

     @Id

    private String id;

    private String name;

    private String contentType;

    private long size;

    private Date uploadDate;

    private String md5;

    private Binary content;

    private String path;

    protected File() {

    }

   public File(String name, String contentType, long size,Binary content) {

       this.name = name;

       this.contentType = contentType;

       this.size = size;

       this.uploadDate = new Date();

       this.content = content;

    }

   /**

    * 重写equals 方法

    */

    @Override

    public boolean equals(Object object) {

        if (this == object) {

            return true;

        }

        if (object == null || getClass() != object.getClass()) {

            return false;

        }

        File fileInfo = (File) object;

        return java.util.Objects.equals(size, fileInfo.size)

                && java.util.Objects.equals(name, fileInfo.name)

                && java.util.Objects.equals(contentType, fileInfo.contentType)

                && java.util.Objects.equals(uploadDate, fileInfo.uploadDate)

                && java.util.Objects.equals(md5, fileInfo.md5)

                && java.util.Objects.equals(id, fileInfo.id);

    }

    /**

     * 重写hashCode

     */

    @Override

    public int hashCode() {

        return java.util.Objects.hash(name, contentType, size, uploadDate, md5, id);

    }

    @Override

    public String toString() {

        return "File{"

                + "name='" + name + '\''

                + ", contentType='" + contentType + '\''

                + ", size=" + size

                + ", uploadDate=" + uploadDate

                + ", md5='" + md5 + '\''

                + ", id='" + id + '\''

                + '}';

    }

}                                                                                                                                                                                                                    

编写repository 层,我实现接口应该集成springboot中 MongoDB 提供的接口类 

/**

 * File 存储库.<br>

 *              采用MongoDB操作

 *    

 * @author Administrator

 *

 */

public interface FileRepository extends MongoRepository<File, String> {

}                                                                                                                                                                                                                    

编写Service层,小编我就主要说要一下 MongoDB 分页查询实现,这里我编写了自己查询Criteria准则,具体实现在文章结尾提供的github开源源码中

 

/**

 * File 服务.

 * @author Administrator

 *

 */

@Service

public class FileServiceImpl implements FileService {

         /**

          * @param fileRepository

          * @param mongoTemplate

          */

         @Autowired

         public FileRepository fileRepository;

         @Autowired

    protected MongoTemplate mongoTemplate;

         /**

          *分页条件查询,按上传时间降序

          * @throws Exception

          */

         @Override

         public Page<File> listFilesByPage(Pageable pageable, MeCriteria meCriteria) throws Exception {

                   List<ExprType> expr= meCriteria.get_expr();

                   //定义查询Criteria链

                    List<Criteria> criteriaChain = new ArrayList<Criteria>();;

                   for (ExprType exprType : expr) {

                            String property = exprType.get_property();

                            if(exprType.get_value()!=null) {

                                     Object value = exprType.get_value();

                                     //mongoDB模糊查询

                                     Pattern pattern = Pattern.compile("^.*" + value + ".*$");

                                     if("name".equals(property)) {

                                              criteriaChain.add(Criteria.where("name").regex(pattern));

                                     }else if("contentType".equals(property)) {

                                              criteriaChain.add(Criteria.where("contentType").regex(pattern));

                                     }

                            }else if( exprType.get_min() !=null &&  exprType.get_max()!=null){

                                     Object min = exprType.get_min();

                                     Object max = exprType.get_max();

                                     if(exprType.get_property().equals("uploadDate")) {

                                               if(min !=null && max !=null && !"".equals(min) && !"".equals(max)) {

                                                        //大于最小时间,小于最大时间

                                                        criteriaChain.add(

                                                                          Criteria.where("uploadDate").gt(DateUtils.parseDate((String) min, "yyyy-MM-dd HH:mm"))

                                                                                             .lt(DateUtils.parseDate((String) max, "yyyy-MM-dd HH:mm")));

                                               }

                                     }else if(exprType.get_property().equals("size")){

                                               if(min !=null && max !=null && !"".equals(min) && !"".equals(max)) {

                                                        //大于最小size,小于最大size

                                              criteriaChain.add(Criteria.where("size").gt(Long.parseLong((String)min)).lt(Long.parseLong((String)max)));

                                               }

                                     }

                                    

                            }

                   }

                   Criteria criteria =new Criteria();

                   criteria.andOperator(criteriaChain.toArray(new Criteria[criteriaChain.size()]));

                   //查询,加入criteria组成条件

                   Query query=new Query(criteria);

                   //分页查询

                   List<File>  list = mongoTemplate.find(query.with(pageable), File.class);

                   //返回分页查询的对象

                   Page<File> page = new PageImpl<File>(list , pageable, mongoTemplate.count(query, File.class));

                   return page;

         }

}                                                                                                                                                                                                                      

Controller层摘要部分复杂查询的代码块

/**

 *文件服务器controller

 * @author Administrator

 *

 */

@CrossOrigin(origins = "*", maxAge = 3600) // 允许所有域名访问,响应最大时间

@Controller

public class FileController {

         @Autowired

         private FileService fileService;

         @Value("${server.address}")

         private String serverAddress;

         @Value("${server.port}")

         private String serverPort;

         /**

          * 访问文件服务器首页

          * @param model

          * @return

          * @throws Exception

          */

         @RequestMapping(value = "/")

         public String index(@RequestParam(value = "async", required = false) boolean async,

                            @RequestParam(value = "pageIndex", required = false, defaultValue = "0") Integer pageIndex,

                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize,

                            Model model) throws Exception {

                   // 展示最新10条数据

                   Sort sort = new Sort(Direction.DESC,"uploadDate");

                   Pageable pageable = PageRequest.of(pageIndex, pageSize , sort);

                   Page<File> page = fileService.listFilesByPage(pageable);

                   model.addAttribute("files", page.getContent());

                   model.addAttribute("page" , page);

                   return "index";

         }

         /**

          * 分页携带条件查询文件

          * @param async

          * @param pageIndex

          * @param pageSize

          * @param criteria

          * @param model

          * @return

          * @throws Exception

          */

         @RequestMapping(value = "/queryAction" , method=RequestMethod.POST)

         public String index(@RequestParam(value = "async", required = false) boolean async,

                            @RequestParam(value = "pageIndex", required = false, defaultValue = "0") Integer pageIndex,

                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize,

                            CriteriaType criteriaType,

                            Model model) throws Exception {

                   // 展示最新二十条数据

                   Sort sort = new Sort(Direction.DESC,"uploadDate");

                   Pageable pageable = PageRequest.of(pageIndex, pageSize , sort);

                   Page<File> page = fileService.listFilesByPage(pageable , criteriaType.getMeCriteria());

                   model.addAttribute("files", page.getContent());

                   model.addAttribute("page" , page);

                   model.addAttribute("meCriteria", criteriaType.getMeCriteria());

                   return "index";

         }

}                                                                                                                                                                                                                    

 

html页面+ thymeleaf 标记实现动态数据展示,小编我遇到一些问题,但也也解决了,我截图瞧瞧!

现在我们就看下最终成果!!!

 

 

上传至github 源码!

文件服务器源码

  • 注意小编这里我不会把所有的代码写入博客中,毕竟代码量还是很多的,还有一点一定要安装 MongoDB ,window傻瓜式操作不用多讲!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot是一个快速开发框架,可以帮助开发人员快速构建基于Spring的应用程序。而MongoDB是一个流行的NoSQL数据库,具有高性能和可扩展性。使用Spring Boot和MongoDB可以轻松构建高效的Web应用程序,同时还可以利用Spring Boot的自动配置和MongoDB的灵活性来简化开发过程。 ### 回答2: Spring Boot是一个开源的Java开发框架,它简化了基于Java的应用程序的开发和配置。它提供了一个快速的开发环境,将开发人员从复杂的配置任务中解放出来,使开发更加高效。Spring Boot通过自动配置来简化应用程序的配置,允许开发人员专注于业务逻辑的实现。 MongoDB是一个流行的开源文档数据库,它使用JSON样式的文档来存储数据。MongoDB具有高度可扩展性和灵活性,并且能够在大型的分布式系统中处理大量的数据。它也可以很好地支持面向对象的数据模型,提供了强大的查询和分析工具。 使用Spring Boot与MongoDB结合,可以更轻松地开发和管理基于MongoDB的应用程序。Spring Boot提供了与MongoDB集成所需的自动配置,包括连接MongoDB服务器、创建和管理数据库、执行CRUD操作等。开发人员只需要通过几行简单的配置和注解,就能够快速地构建出一个可用的基于MongoDB的应用程序。 此外,Spring Boot还提供了一些方便的功能和工具,使得与MongoDB的交互更加方便。例如,它提供了Spring Data MongoDB模块,该模块为开发人员提供了更高级的数据库访问抽象,使得使用MongoDB更加简单和灵活。同时,Spring Boot还支持使用MongoTemplate和MongoRepository等工具来进行数据库操作,使开发人员可以更轻松地进行数据操作和查询。 综上所述,Spring Boot与MongoDB结合使用,能够大大简化基于MongoDB的应用程序的开发和管理工作,提高开发效率。它提供了简单而强大的工具和自动配置,使开发人员可以更加专注于业务逻辑的实现,而无需花费过多时间和精力在繁琐的配置工作上。 ### 回答3: Spring Boot是一个用于创建基于Java的独立、生产级别的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了一种快速开发和构建可伸缩应用程序的方式。 MongoDB是一个开源的文档数据库,它以JSON样式的文档存储数据,而不是传统的关系型数据库表结构。它具有高度可伸缩性、高性能和灵活的数据建模能力。 Spring Boot集成了对MongoDB的支持,使得开发人员可以简单快速地将MongoDB集成到Spring应用程序中。它提供了MongoDB驱动程序的自动配置,并为我们处理了与数据库的连接、集合操作、事务等方面的繁琐工作。 使用Spring Boot和MongoDB可以实现以下几个方面的好处: 1. 快速开发:Spring Boot提供了自动配置功能,减少了配置和部署的复杂性,使得开发人员可以更加专注于业务逻辑的实现。 2. 高度可伸缩性:MongoDB的分布式架构使得它可以轻松地扩展,适应不同规模和复杂度的应用需求。 3. 灵活的数据建模:MongoDB的文档存储方式使得数据建模更加灵活,可以根据应用程序的需求自由设计文档结构。 4. 高性能:MongoDB采用了内存映射存储引擎,使得数据的读写速度更快,并且支持水平扩展,保证了高并发下的稳定性和性能。 总之,Spring Boot和MongoDB的结合使得开发人员能够快速构建可伸缩和高性能的应用程序,并且通过灵活的数据建模能力满足不同的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值