Spring Boot 2.0 读书笔记_17:MongoDB 下 [整合 Spring Boot]

版权声明:未经博主本人同意,请勿私自转发分享。 https://blog.csdn.net/Nerver_77/article/details/88957733

Spring Boot 整合 MongoDB

书接上回,开始 Spring Boot 和 MongoDB 的整合。有了 Maven 这一项目管理构建工具,可以很容易的在 pom 文件中引入依赖来统一管理 jar包

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

引入MongoDB相关依赖后,需要在 application.properties 中配置数据源连接信息

spring.data.mongodb.uri=mongodb://test:123%[email protected]:27017/baike

- 27017 是 MongoDB 默认端口

- %25 是用户密码字符 % 的 URI Encode 结果

- test 是 auth 校验通过的 数据库用户名


CURD 操作举例

  • 数据库文档记录对象映射[ORM]

      public class Baike {
      	// 对应文档记录主键 MongoDB 中的 _id
          private String id;
          private String desc;
          private List<String> tag = new ArrayList<String>();
          private Comment comment = null;
          private Date crateDate = null;
          private Date updateDate = null;
      	// 逻辑删除状态控制 默认为 0
          private int status = 0;
      	
      	// getter 和 setter 方法省略
      }
    

在开始CURD操作前,根据 entity类 来梳理下 BSON 数据格式是长什么样子的!

	{
	    "id": "MongoDB",
	    "desc": "NoSQL 数据库",
	    "tag": [
	        "IT",
	        "DB"
	    ],
	    "comment": {
	        "good": 68599,
	        "bad": 416
	    },
	    "crateDate": "2019-03-31T03:11:02.872+0000",
	    "updateDate": null
	}

说明:

  • tag 字段是 List 列表数组类型,请求携带参数格式应为: tag[0] = "IT"

  • comment 字段是 entity Obj 类型,请求携带参数格式应为: comment.good = 48596

  • 在BSON数据中,数组类型数据采用 [ ] 标识,对象类型数据采用 { } 标识

  • 测试接口请求URL如下所示:

      	/api?id=MongoDB&desc=NoSQL 数据库&tag[0]=IT&tag[1]=DB&comment.good=68599&comment.bad=416
    

  • MongoTemplate [核心]

    在 Spring Boot 中 使用 MongoTemplate 作为核心来进行 CURD 基本操作。MongoTemplate 是 线程安全的。类比 JDBCTemplate,同样都是数据库操作的模板接口实现类,提供了便捷的数据库访问接口方法。如:insert、find、update等方法。
    此外,MongoTemplate 可以直接自动注入到 Spring 管理的 Bean 中。

    这里还需要简单介绍两个东东:Criteria 类 和 Query 类

    • Criteria 类:封装所有的操作数据库文档记录操作语句,以方法的形式进行文档记录查询 [where阶段]
    • Query 类:将文档记录查询语句进一步封装 [复杂查询条件查询阶段]
    • 简单来讲就是,通过 where 构建 Criteria 对象,然后调用不同的方法增加操作符 [lt、gt、and、or]。之后使用 Query 对象进行封装后 添加最后的查询条件 [排序、自增、分组等]。最后传入 MongoTemplate的对应方法中,执行文档记录相关操作。
    • 听起来是不是一脸懵逼,这里也可以类比 Mybatis 这一ORM 框架的复杂查询构造规则,很类似,换汤不换药的操作。下面将通过实际的代码来体会上述文字表述的具体实现过程!

  • Create

    MongoTemplate 中的 insert 方法,IDEA 中 Ctrl + F12 进入类信息概览
    在这里插入图片描述

    这里我们采用了最常用的 insert <Object obj> 这一接口方法,测试截图如下:
    在这里插入图片描述

    上述图中说明了,控制层请求处理方法、postMan模拟请求[含有格式]、测试结果返回以及相关日志信息打印等信息。

  • Update

    mongoTemplate 可以通过 update方法 进行文档修改操作 [save 方法也可,详情可以查看官网API]

    这里列出常用的文档修改 API:

      // 更新符合条件的第一条文档记录
      public UpdateResult updateFirst(Query query, Update update, Class<?> entityClass)  
      // 更新符合条件的所有记录
      public UpdateResult updateMulti(Query query, Update update, Class<?> entityClass)
    

    这里结合 Update 对象,进行文档记录的批量更新举例,测试结果见下图:
    在这里插入图片描述

    上述例子中需要说明:通过 where 构建 Criteria 对象 [含有 in 操作],采用 Update对象 中的 inc 方法添加自增的查询条件,最后调用了mongoTemplate的批量更新方法,进行文档记录的更新。

  • Read [查询]

    调用 find 相关方法进行文档记录的查找操作,当然这里也可以利用上述到 Criteria对象 构造查询条件。

    这里就 findById这一简单方法进行距离,测试截图如下:
    在这里插入图片描述

    图中的查询条件为:entity Obj の id (对应数据库中文档记录主键 _id ),这个问题之前也已经提到了,文档记录的主键设置最好根据实际应用来进行设置。

  • Delete

    关于删除,需要多说两句,这里牵扯两个概念:逻辑删除物理删除

    顾名思义,前者不是真的将文档记录从数据库中删除,只是改变了其 状态 [关于状态,我们可以用电商应用举例,某商品售罄,此时数据库记录应该将其删除吗? 不,因为后续还可能引入,所以这里仅仅将某商品做下架状态设置,而当前在售商品中只展示未售罄的产品即可]。所以 逻辑删除 仅仅是对数据打上一个 删除标记 而已。而后者,物理删除 就是实打实的讲数据从存储介质中彻底删除掉!

    那么,物理删除的操作方法有什么呢? mongoTemplate 中提供了 remove 方法进行文档记录的 物理删除,API举例如下:

      public DeleteResult remove (Object object)
      public DeleteResult remove (Query query, Class<?> entityClass)
    

    这里的测试代码也做了 逻辑删除,根据 entity 的 status 字段进行更新,表示实现 逻辑删除在这里插入图片描述

    由此可见,文档记录状态字段已经被更改,后续的数据查询展示工作都可以通过限制该状态字段来实现了,这样做也很方便。

猜你喜欢

转载自blog.csdn.net/Nerver_77/article/details/88957733