乐趣区

关于spring:Spring认证中国教育管理中心Spring-Data-Couchbase教程八

原题目:Spring 认证中国教育管理中心 -Spring Data Couchbase 教程八(Spring 中国教育管理中心)

Spring Data Couchbase 教程八
4.8.3. 存储库填充器
如果您应用 Spring JDBC 模块,您可能相熟 DataSource 应用 SQL 脚本填充 a 的反对。存储库级别也有相似的形象,只管它不应用 SQL 作为数据定义语言,因为它必须独立于存储。因而,填充器反对 XML(通过 Spring 的 OXM 形象)和 JSON(通过 Jackson)来定义用于填充存储库的数据。

假如您有一个名为的文件 data.json,其内容如下:

示例 72. JSON 中定义的数据

[{ “_class” : “com.acme.Person”,
“firstname” : “Dave”,
“lastname” : “Matthews” },
{“_class” : “com.acme.Person”,
“firstname” : “Carter”,
“lastname” : “Beauford” } ]
您能够应用 Spring Data Commons 中提供的存储库命名空间的填充器元素来填充存储库。要将后面的数据填充到您的 中 PersonRepository,请申明一个相似于以下内容的填充器:

示例 73. 申明一个 Jackson 存储库填充器

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:repository=”http://www.springframework.org/schema/data/repository”
xsi:schemaLocation=”http://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/repository
https://www.springframework.org/schema/data/repository/spring-repository.xsd">

<repository:jackson2-populator locations=”classpath:data.json” />

</beans>
后面的申明导致 data.json 文件被 Jackson 读取和反序列化 ObjectMapper。

JSON 对象解组的类型是通过查看_classJSON 文档的属性来确定的。基础设施最终会抉择适当的存储库来解决反序列化的对象。

要改为应用 XML 来定义存储库应填充的数据,您能够应用该 unmarshaller-populator 元素。您将其配置为应用 Spring OXM 中可用的 XML 编组器选项之一。无关详细信息,请参阅 Spring 参考文档。以下示例显示如何应用 JAXB 解组存储库填充器:

示例 74. 申明解组存储库填充器(应用 JAXB)

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:repository=”http://www.springframework.org/schema/data/repository”
xmlns:oxm=”http://www.springframework.org/schema/oxm”
xsi:schemaLocation=”http://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/repository
https://www.springframework.org/schema/data/repository/spring-repository.xsd
http://www.springframework.org/schema/oxm
https://www.springframework.org/schema/oxm/spring-oxm.xsd">

<repository:unmarshaller-populator locations=”classpath:data.json”

unmarshaller-ref="unmarshaller" />

<oxm:jaxb2-marshaller contextPath=”com.acme” />

</beans>

  1. Couchbase 存储库
    Spring Data repository 形象的指标是显着缩小为各种持久性存储实现数据拜访层所需的样板代码量。

默认状况下,如果操作是单文档操作并且 ID 已知,则操作由 Key/Value 反对。对于所有其余操作,默认状况下会生成 N1QL 查问,因而必须为高性能数据拜访创立适当的索引。

请留神,您能够为查问调整所需的一致性(请参阅应用一致性查问)并领有由不同存储桶反对的不同存储库(请参阅[
couchbase.repository.multibucket])

5.1。配置
尽管始终存在对存储库的反对,但您须要在个别状况下或为特定命名空间启用它们。如果您扩大
AbstractCouchbaseConfiguration,只需应用 @EnableCouchbaseRepositories 正文。它提供了许多可能的选项来放大或自定义搜寻门路,最常见的选项之一是 basePackages.

另请留神,如果您在 Spring Boot 中运行,则主动配置反对曾经为您设置了正文,因而您只须要在想要笼罩默认值时应用它。

示例 75. 基于正文的存储库设置

@Configuration
@EnableCouchbaseRepositories(basePackages = {“com.couchbase.example.repos”})
public class Config extends AbstractCouchbaseConfiguration {

//...

}
[
couchbase.repository.multibucket] 中形容了高级用法。

5.2. 用法
在最简略的状况下,您的存储库将扩大 CrudRepository<T, String>,其中 T 是您要公开的实体。让咱们看一下 UserInfo 的存储库:

示例 76. UserInfo 存储库

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<UserInfo, String> {
}
请留神,这只是一个接口,而不是一个理论的类。在后盾,当您的上下文被初始化时,您的存储库形容的理论实现将被创立,您能够通过惯例 bean 拜访它们。这意味着您将节俭大量样板代码,同时仍将残缺的 CRUD 语义裸露给您的服务层和应用程序。

当初,让咱们设想一下,咱们 @Autowire 的 UserRepository 一类,使得应用它。咱们有哪些可用的办法?

Spring Data Couchbase 教程八
当初太棒了!只需定义一个接口,咱们就能够在托管实体之上取得残缺的 CRUD 性能。

尽管公开的办法为您提供了品种繁多的拜访模式,但您通常须要定义自定义的拜访模式。您能够通过向界面增加办法申明来做到这一点,这将在后盾主动解析为申请,咱们将在下一节中看到。

5.3. 存储库和查问
5.3.1。基于 N1QL 的查问
先决条件是在存储实体的存储桶上创立了一个 PRIMARY INDEX。

这是一个例子:

示例 77. 具备 N1QL 查问的扩大 UserInfo 存储库

public interface UserRepository extends CrudRepository<UserInfo, String> {

@Query("#{#n1ql.selectEntity} WHERE role ='admin'AND #{#n1ql.filter}")
List<UserInfo> findAllAdmins();

List<UserInfo> findByFirstname(String fname);

}
在这里,咱们看到了两种 N1QL 反对的查问形式。

第一种办法应用 Query 正文来提供 N1QL 内联语句。SpEL(Spring 表达式语言)由 #{和之间的 SpEL 表达式块反对}。SpEL 提供了一些特定于 N1QL 的值:

n1ql.selectEntity 容许轻松确保语句将抉择构建残缺实体所需的所有字段(包含文档 ID 和 CAS 值)。

n1ql.filter 在 WHERE 子句中增加一个条件,将实体类型与 Spring Data 用于存储类型信息的字段匹配。

n1ql.bucket 将替换为存储实体的存储桶的名称,以反引号本义。

n1ql.fields 将替换为重建实体所需的字段列表(例如,对于 SELECT 子句)。

n1ql.delete 将被 delete from 申明所取代。

n1ql.returning 将替换为重建实体所需的返回子句。

咱们建议您始终应用 selectEntitySpEL 和带有 SpEL 的 WHERE 子句 filter(否则您的查问可能会受到来自其余存储库的实体的影响)。

基于字符串的查问反对参数化查问。您能够应用诸如“$1”之类的地位占位符,在这种状况下,每个办法参数将按程序映射到 $1, $2, $3… 或者,您能够应用“$someString”语法应用命名占位符。办法参数将应用参数名称与其对应的占位符匹配,能够通过应用(例如)正文每个参数(aPageable 或除外 Sort)来笼罩该占位符。您不能在查问中混合应用这两种办法,如果这样做会失去。@Param@Param(“someString”)IllegalArgumentException

请留神,您能够混合应用 N1QL 占位符和 SpEL。N1QL 占位符仍将思考所有办法参数,因而请务必应用正确的索引,如下例所示:

示例 78. 混合 SpEL 和 N1QL 占位符的内联查问

@Query(“#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND #{[0]} = $2”)
public List<User> findUsersByDynamicCriteria(String criteriaField, Object criteriaValue)
这容许您生成与例如相似的查问。AND name = “someName” 或者 AND age = 3,应用单个办法申明。

您还能够在 N1QL 查问中进行单次投影(前提是它只抉择一个字段并只返回一个后果,通常是一个聚合,如 COUNT, AVG, MAX…)。这样的投影将有一个简略的返回类型,如 long,boolean 或 String。这是不打算预测到的 DTO。

另一个例子:

{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND test = $1

相当于
SELECT #{#n1ql.fields} FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} AND test = $1

SpEL 与 Spring Security 的理论利用

当您想要依据其余 Spring 组件(如 Spring Security)注入的数据进行查问时,SpEL 会很有用。这是扩大 SpEL 上下文以拜访此类内部数据所需执行的操作。

首先,您须要实现一个
EvaluationContextExtension(应用如下反对类):

class SecurityEvaluationContextExtension extends EvaluationContextExtensionSupport {

@Override
public String getExtensionId() {

return "security";

}

@Override
public SecurityExpressionRoot getRootObject() {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return new SecurityExpressionRoot(authentication) {};

}
}
而后,为了让 Spring Data Couchbase 可能拜访关联的 SpEL 值,您须要做的就是在配置中申明一个相应的 bean:

@Bean
EvaluationContextExtension securityExtension() {

return new SecurityEvaluationContextExtension();

}
这对于依据连贯用户的角色制作查问很有用,例如:

@Query(“#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND ” +
“role = ‘?#{hasRole(‘ROLE_ADMIN’) ? ‘public_admin’ : ‘admin’}'”)
List<UserInfo> findAllAdmins(); //only ROLE_ADMIN users will see hidden admins
删除查问示例:

@Query(“#{#n1ql.delete} WHERE #{#n1ql.filter} AND ” +
“username = $1 #{#n1ql.returning}”)
UserInfo removeUser(String username);
第二种办法应用 Spring-Data 的查问派生机制从办法名称和参数构建 N1QL 查问。这将产生一个如下所示的查问:SELECT … FROM …​ WHERE firstName = “valueOfFnameAtRuntime”. 您能够联合这些条件,甚至应用相似名称进行计数 countByFirstname 或应用相似名称进行限度 findFirst3ByLastname…

实际上,生成的 N1QL 查问还将蕴含一个额定的 N1QL 规范,以便仅抉择与存储库的实体类匹配的文档。

反对大多数 Spring-Data 关键字:.@Query (N1QL) 办法名称中反对的关键字

Spring Data Couchbase 教程八
Spring Data Couchbase 教程八
您能够应用此办法同时应用计数查问和限度查问后果性能。

应用 N1QL,存储库的另一个可能接口是
PagingAndSortingRepository(扩大 CrudRepository)。它减少了两种办法:

Spring Data Couchbase 教程八

退出移动版