Spring MongoDB

为什么选择MongoDB,而不是其它的数据库。

在SQL和NoSQL之间有一个大的争论。

在SQL中,创建Tables。

在NoSQL中,我们不维持这个结构。

为什么这样重要。

因为SQL在19世纪70年代变得流行的时候,在那时存储是昂贵的。

我们需要确保使用最小的存储,这样我们可以存储最大量的数据。

这是SQL类型表的意义。

在当前的世界,我们有如此多的非结构化的数据,不能够基于它们创建列。

如果你的表被创建,而想要添加一个新列。

这在SQL中是令人头痛的事,我们不希望在这里使用SQL。

第二个情况是,你想要扩展应用。你想要数据库的复制品。

在SQL中是很难做的。

当然,你可以有复制品。但是同步它是很困难的。

NoSQL在这方面胜出。

MongoDB是NoSQL的数据库。没有Tables,而是Collections。

SQL中用行来存储数据。

在NoSOL中是一个Document。

Documents是Collections的一部分。

不需要为MongoDB安装软件,因为会使用云服务,这个技能集合是很重要的。

其次,需要创建一个MongoDB Service。

MongoDB Atlas。

可以选择AWS,Google Cloud或者Azure。

将在本地环境中使用,连接在自己机器上运行的应用。

仅仅允许自己的机器使用数据库。

这样就部署好了数据库。

Cluster被创建了,还没有创建数据库。

可以点击Browse Collection来浏览数据库。

Collection相当于SQL中的Table。

在Collection里面创建数据库名称,和Collection名称。

为了连接应用到MongoDB,必须要指明MongoDB在哪。

首先,你的MongoDB在系统中,还是在云端上。

第二,你的数据库名是什么,用户名和密码是什么。

在resource目录的application.propertiesl里,可以做这些配置。

 现在,想要发送请求到服务端。在Spring框架中,我们使用Spring MVC。

首先创建数据实体,一个Pojo(Plain Ordinary Java Object)

映射Java类到Document。

@Document(collection = "name")

建立一个一对多的关系时,

@DocumentReference

导致数据库仅仅存储条目的Id,称为手动索引关系。

也有其它的方法在MongoDB中创建关系。

接下来创建Controller。

@RestController

@RequestMapping("/api/v1/name")

返回值为ResponseEntity。HttpStatus.OK返回值类型是200。

curl -i http://localhost:8080/api/v1/name

任何适当的RestAPI 都应该返回合适的状态码。

接下来,尝试从数据库中拉一些数据。

在Core Java  JDBC中需要写很多步骤。

在Spring Data中比较容易。

不需要写任何的方法,任何的实现。

不需要写任何的方法,不需要创建任何的类来实现。

MogoRepository将负责所有的CRUD操作。

需要一个Repository类。

Repository是Interface类型。

extends MongoRepository<DataType, IdType>

@Repository,框架知道这是一个Repository。

一旦我们创建了这个Repository。

创建一个Service类,不需要继承任何类。

@Service

在这个类中,将写数据库访问的代码。

在Service类中,需要一个Repository的引用。

@Autowired意味着Springboot将为你创建一个对象。

findAll方法在MongoRepository中被描述。

可以直接使用MongoRepository中的方法。

再返回到Controller,需要一个Service类的引用。

Controller,返回一个HttpStatus.OK的状态码。它并不知道在Service类中做的是什么事情。

当返回到Service类中,这是大部分业务逻辑的地方。

Service类使用了Repository类,和数据库交互,并且返回到API层。

最后Reoisitory层,也就是数据访问层,实际上和数据库交互,获取到数据回来。

在Controller类中

@PathVariable让框架知道。

findById方法可能不能发现一个Item数据,也许你传递的Id不存咋。

所以在这样的情况下,将要返回Null。

需要让Java知道可能返回Null,通过Optional。

不想暴露Collection实体的ID到公共场合,使用另一个imdbId

尽管Repository有用法Id查询的内置的方法,但是却没有搜索imdbId的内置方法,所以我们需要自己实现。

实现它很容易,因为有自动查询。

find<DocumentName>By<YourId>

仅仅通过命名这个方法,MongoDB数据。

Spring Data MongoDB将会理解我们在尝试做什么,它是如此的智能化。

属性名需要时唯一的。因为如果不是唯一的,

已经学习到了Repository作为和数据库交互的一种方式,另一种方式是使用MongoTemplate。

有时候可能有不能够在Repository中实现的复杂的操作。

或者,尽管你可以再Repository中实现它,也并不适合。

这个时候我们需要Template,我们可以通过Template来形成一个新的动态查询,不使用Repository在数据库中完成工作。

mongoTemplate.update(<ClassName>.class)
.matching(Criteria.where("idName").is(idName))
.apply(new Update().push("keyName").value(valueName))
.first();

使用template来执行一个update调用

复习上面的过程,我们采用了一个mongoTemplate,使用它来更新document中的一项数据。

有时,你必须自己编写一些复杂的业务逻辑。

Controller中创建一个Post请求

public ResponseEntity<Item> createItem(@RequestBody Map<String, String> payload) {

}

在Postman中测试请求,先创建一个Collection。

raw改为Json format。

这样就可以从用户处接收Json数据,key是String类型,value也是String类型。

从这个Map中,可以取得数据。

这就是如何用Springboot来创建一个新的后端API。

接下来进一步可以学习authorization(授权)和anthentication(认证)。

也可以学习更加复杂的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值