当前位置: 首页 > 后端技术 > Java

Spring认证中国教育管理中心-SpringDataR2DBC框架教程二

时间:2023-04-01 17:59:38 Java

原标题:Spring认证中国教育管理中心-SpringDataR2DBC框架教程二(Spring中国教育管理中心)13.4.R2dbcEntityOperations数据访问APIR2dbcEntityTemplate是SpringDataR2DBCCentral入口点。它为查询、插入、更新和删除数据等典型的临时用例提供了直接面向实体的方法和更窄、更流畅的接口。入口点(insert()、select()、update()等)遵循基于要运行的操作的自然命名模式。从入口点开始,API旨在仅提供上下文相关的方法,这些方法会导致SQL语句的创建和终止。SpringDataR2DBC使用R2dbcDialect抽象来确定底层驱动程序本机支持的绑定标记、分页支持和数据类型。所有终端方法始终返回表示所需操作的Publisher类型。实际语句在订阅时发送到数据库。13.4.1。插入和更新实体的方法R2dbcEntityTemplate中有几种方便的方法可用于保存和插入对象。为了对转换过程进行更细粒度的控制,您可以注册Spring转换器R2dbcCustomConversions—例如Converter和Converter。使用保存操作的一个简单案例是保存一个POJO。在这种情况下,表名由类名(非完全限定)确定。您还可以使用特定的集合名称调用保存操作。您可以使用映射元数据来覆盖存储对象的集合。在插入或保存时,如果不设置Id属性,则假定其值由数据库自动生成。因此,为了自动生成,类中Id属性或字段的类型必须是Long,或者Integer。以下示例显示如何插入一行并检索其内容:示例55.使用R2dbcEntityTemplatePersonperson=newPerson("John","Doe");Monosaved=template.insert(person);Monoloaded=template.selectOne(query(where("firstname").is("John")),Person.class);以下插入和更新操作可用:一组类似的插入操作也可用:Monoinsert(TobjectToSave):将对象插入默认表。Monoupdate(TobjectToSave):将对象插入到默认表中。可以使用流畅的API自定义表名。13.4.2。选择数据R2dbcEntityTemplate中的select(…)和selectOne(…)方法用于从表中选择数据。这两种方法都采用一个Query对象,该对象定义字段投影、WHERE子句、ORDERBY子句和限制/偏移分页。无论底层数据库如何,限制/偏移功能对应用程序都是透明的。R2dbcDialect抽象支持此功能以适应各种SQL风格之间的差异。示例56.使用R2dbcEntityTemplateFluxloaded=template.select(query(where("firstname").is("John")),Person.class);13.4.3。FluentAPI本节介绍FluentAPI的用法。考虑以下简单查询:Fluxpeople=template.select(Person.class).all();Person与select(...)方法一起使用,将表结果映射到Person结果对象。getall()行返回一个没有边界的Flux。以下示例声明了一个更复杂的查询,该查询按名称、WHERE条件和ORDERBY子句指定表名:Monofirst=template.select(Person.class).from("other_person").matching(query(where("firstname").is("John").and("lastname").in("Doe","White")).sort(by(desc("id")))).one();SELECTFROMTABLEBYNAME使用给定字段类型返回行结果。发出的查询WHERE声明了firstname和lastname列的条件以过滤结果。结果可以按单独的列名排序,从而产生ORDERBY子句。选择一个结果将只获取一行。这种使用行的方式期望查询只返回一个结果。如果查询产生多个结果,Mono将抛出一个IncorrectResultSizeDataAccessException。Spring认证中国教育管理中心-SpringDataR2DBC框架教程2可以通过提供目标类型直接对结果select(Class)进行投影。您可以使用以下终止方法在检索单个实体和检索多个实体之间切换:first():仅消耗第一行,返回Mono。如果查询没有返回结果,Mono会返回完成而不发出对象。one():只消耗一行并返回一个Mono。如果查询没有返回结果,则Mono返回完成而不发出对象。如果查询返回多行,Mono将完成抛出IncorrectResultSizeDataAccessException。all():使用所有返回的行返回一个Flux。count():应用计数投影返回Mono。exists():返回查询是否通过返回Mono产生了任何行。您可以使用select()入口点表达您的SELECT查询。生成的SELECT查询支持常用的子句(WHERE和ORDERBY)并支持分页。流畅的API风格让您可以将多个方法链接在一起,同时拥有易于理解的代码。为了更好的可读性,您可以使用静态导入来避免使用“new”关键字来创建Criteria实例。Criteria类的方法Criteria类提供了以下方法,所有这些方法都对应于SQL运算符:Criteriaand(Stringcolumn):将具有指定链接属性的Criteria添加到当前Criteria并返回新创建的Criteria。Criteria或(String列):将Criteria属性指定的链添加到当前Criteria并返回新创建的链。CriteriaGreaterThan(Objecto):使用>运算符创建条件。CriteriaGreaterThanOrEquals(Objecto):使用>=运算符创建条件。Criteriain(Object...o):通过在varargs参数上使用IN运算符来创建条件。Criteriain(Collectioncollection):Criteria是使用IN集合的运算符创建的。Criteriais(Objecto):使用列匹配(property=value)创建条件。CriteriaisNull():使用ISNULL运算符创建条件。CriteriaisNotNull():使用ISNOTNULL运算符创建条件。CriterialessThan(Objecto):使用<运算符创建条件。CriterialessThanOrEquals(Objecto):使用?运算符创建条件。Criterialike(Objecto):使用不进行转义字符处理的LIKE运算符创建条件。Criterianot(Objecto):使用!=运算符创建条件。CriterianotIn(Object…o):通过在可变参数参数上使用NOTIN运算符来创建条件。CriterianotIn(Collectioncollection):使用NOTIN集合运算符创建条件。您可以将Criteria与SELECT、UPDATE和DELETE查询一起使用。13.4.4。插入数据您可以使用insert()入口点插入数据。考虑以下简单的类型化插入操作:Monoinsert=template.insert(Person.class).using(newPerson("John","Doe"));根据Map元数据设置表,Person与into(...)方法一起使用。它还准备插入语句以接受要插入的Person对象。提供标量Person对象。或者,您可以提供一个Publisher来运行INSERT语句流。该方法提取所有非空值并插入。13.4.5。更新数据您可以使用update()入口点来更新行。更新数据首先通过接受Update指定的赋值来指定要更新的表。它还接受一个Query来创建一个WHERE子句。考虑以下简单的类型化更新操作:约翰"))).apply(更新("年龄",42));Person根据映射元数据更新对象并应用映射。通过调用inTable(…)方法设置不同的表名。指定转换为WHERE子句的查询。应用更新对象。在这种情况下,将age设置为42并返回受影响的行数。13.4.6。删除数据您可以使用delete()入口点删除行。删除数据从要从中删除的表的规范开始,并且可以选择接受aCriteria来创建WHERE子句。考虑以下简单的插入操作:Monodelete=template.delete(Person.class).from("other_table").matching(query(where("firstname").is("John"))).all();删除Person对象并根据映射元数据应用映射。通过调用from(…)方法设置不同的表名。指定转换为WHERE子句的查询。应用删除操作并返回受影响的行数。R2DBC存储库本章指出R2DBC存储库支持的功能。本章建立在使用Spring数据存储库中解释的核心存储库支持之上。在阅读本章之前,您应该对其中解释的基本概念有充分的理解。14.1.用法要访问存储在关系数据库中的域实体,您可以使用我们完善的存储库支持,这大大简化了实施。为此,请为您的存储库创建一个接口。考虑以下Person类:示例57.示例Person实体publicclassPerson{@IdprivateLongid;私有字符串名字;私有字符串姓氏;//...gettersandsettersomitted}以下示例显示了上述Person类的存储库接口:示例58.持久化Person实体的基本存储库接口publicinterfacePersonRepositoryextendsReactiveCrudRepository{//其他自定义查询方法去这里}要配置R2DBC存储库,您可以使用@EnableR2dbcRepositories注释。如果没有配置基础包,基础架构会扫描包以查找带注释的配置类。以下示例展示了如何使用存储库的Java配置:示例59.存储库的Java配置@Configuration@EnableR2dbcRepositoriesclassApplicationConfigextendsAbstractR2dbcConfiguration{@OverridepublicConnectionFactoryconnectionFactory(){return...}}由于我们的域存储库扩展了ReactiveCrudRepository,它为您提供响应式CRUD操作以访问实体。除了ReactiveCrudRepository,还有ReactiveSortingRepository,它增加了类似于PagingAndSortingRepository的额外排序功能。使用存储库实例只是将其依赖项注入客户端的问题。因此,您可以使用以下代码检索所有Person对象:示例60.对Person实体的分页访问@ExtendWith(SpringExtension.class)@ContextConfigurationclassPersonRepositoryTests{@AutowiredPersonRepositoryrepository;@TestvoidreadsAllEntitiesCorrectly(){repository.findAll()。as(StepVerifier::create).expectNextCount(1).verifyComplete();}@TestvoidreadsEntitiesByNameCorrectly(){repository.findByFirstname("HelloWorld").as(StepVerifier::create).expectNextCount(1).verifyComplete();}}Spring认证中国教育管理中心-SpringDataR2DBC框架教程二前面的例子使用Spring的单元测试支持创建一个应用上下文,将基于注解的依赖注入到测试用例中。在测试方法中,我们使用存储库查询数据库。我们使用StepVerifier作为测试辅助工具来验证我们对结果的期望。