Spring Boot 2.0 读书笔记_17:MongoDB 下 [整合 Spring Boot]
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 字段进行更新,表示实现逻辑删除
由此可见,文档记录状态字段已经被更改,后续的数据查询展示工作都可以通过限制该状态字段来实现了,这样做也很方便。