spring data 简介

94
Spring Data 简简 Mark Pollack 简简

Upload: giselle-whitaker

Post on 02-Jan-2016

258 views

Category:

Documents


6 download

DESCRIPTION

Spring Data 简介. Mark Pollack 博士. 议题. 当前的数据形态 项目目标 项目概览. 企业数据趋势. 企业数据趋势. 非结构化数据 无预定义的数据模型 经常不大适合于 RDBMS 预聚合数据 在数据收集期间进行计算 计数器 运行平均数. 数据的价值. Mozilla/5.0 ( Macintosh ; U ; Intel Mac OS X; en ) AppleWebKit/418.9 ( KHTML ,比如 Gecko ) Safari/419.3. 数据的价值超越了软硬件成本 连接数据集的价值 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Spring Data  简介

Spring Data 简介Mark Pollack 博士

Page 2: Spring Data  简介

• 当前的数据形态• 项目目标• 项目概览

议题

2

Page 3: Spring Data  简介

企业数据趋势

3

Page 4: Spring Data  简介

企业数据趋势

4

非结构化数据•无预定义的数据模型•经常不大适合于 RDBMS

预聚合数据•在数据收集期间进行计算•计数器•运行平均数

Page 5: Spring Data  简介

• 数据的价值超越了软硬件成本

• 连接数据集的价值– 通过用户代理程序将电子商务用户组合起来

数据的价值

5

Mozilla/5.0 ( Macintosh; U; Intel Mac OS X; en ) AppleWebKit/418.9 ( KHTML ,比如 Gecko ) Safari/419.3

Page 6: Spring Data  简介

• 极其难以 / 不可能在 RDBMS 中扩展写操作– 纵向扩展受限制 / 成本高昂– 横向扩展受限制或耗费资金

• 从 ACID 转换到 BASE– 基本可用、可扩展、最终一致性

• NoSQL 数据存储成为新兴的“点解决方案”– Amazon/Google 论文– Facebook 、 LinkedIn …

数据革命

6

Page 7: Spring Data  简介

NoSQL

7

“不仅仅 SQL”NOSQL \no-seek-wool\ n. 描述当下的趋势,即开发人员越多越多地选择用非关系数据库来帮助解决其问题,试图使用合适的工具来完成合适的工作。

查询机制

关键字查询、映射缩减、按示例查询、查询语言、遍历

Page 8: Spring Data  简介

• “大数据”是指规模过大,以至一般数据库软件工具无法进行数据捕获、存储、管理和分析的数据集。

• 一个主观性和不断移动的目标。• 当今许多领域中的大数据的大小范围为从几十个 TB 到多

个 PB

大数据

8

Page 9: Spring Data  简介

现实检验

9

Page 10: Spring Data  简介

现实检验

10

Page 11: Spring Data  简介

项目目标

11

Page 12: Spring Data  简介

• 数据访问形态已经发生天翻地覆的变化• RDBMS 仍然占据重要和支配性的地位

– 但不再被视作“万金油”解决方案• 但 RMBMS 具有局限性

– 难以扩展• 新的数据访问技术正在解决 RMBMS 所无法解决的问题

– 更高的性能和可扩展性,不同的数据模型– 常常受到限制的事务模型和松弛的一致性

• 坚持使用多种语言变得更普遍– 在一个解决方案中将 RDBMS 与其他数据库相结合

Spring Data – 背景和动机

12

Page 13: Spring Data  简介

• Spring 一直提供出色的数据访问支持– 事务管理– 可移植的数据访问异常层次结构– JDBC – JdbcTemplate– ORM – 支持 Hibernate 、 JPA 、 JDO 、 Ibatis– 支持缓存 (Spring 3.1)

• Spring Data 项目于 2010 年启动• 目标是“刷新” Spring 的数据访问支持

– 参照新的数据访问形态

Spring 和数据访问

Page 14: Spring Data  简介

Spring Data 使命声明

14

89% of all virtualized applications in the world run on VMware.

Gartner, December 2008“为大数据、 NoSQL 和关系存储提供熟

悉、一致且基于 Spring 的编程模型,同时保留特定于存储的特性和功能。

Page 15: Spring Data  简介

Spring Data 使命声明

15

89% of all virtualized applications in the world run on VMware.

Gartner, December 2008“为大数据、 NoSQL 和关系存储提供

熟悉、一致且基于 Spring 的编程模型,同时保留特定于存储的特性和功能。

Page 16: Spring Data  简介

Spring Data 使命声明

16

89% of all virtualized applications in the world run on VMware.

Gartner, December 2008“特定于存储的特性和功能。

Page 17: Spring Data  简介

• 关系型– JPA– JDBC 扩展

• NoSQL– Redis– HBase– Mongo– Neo4j– Lucene– Gemfire

• 大数据– Hadoop

• HDFS 和 M/R• Hive• Pig• Cascading

– Splunk

• 访问– 资源库– QueryDSL

– REST

Spring Data – 支持的技术

17

Page 18: Spring Data  简介

• 通过熟悉的 Spring 模板样式访问特定于数据库的特性– RedisTemplate– HBaseTemplate– MongoTemplate– Neo4jTemplate– GemfireTemplate

• 共享的编程模型和数据访问机制– 资源库模型

• 跨数据存储的公用 CRUD

– 与 QueryDSL 集成• 类型安全的查询语言

– REST 导出器• 以基于 REST 的方式通过

HTTP 公开资源库。

Spring Data – 一切由您做主

Page 19: Spring Data  简介

项目概览

19

Page 20: Spring Data  简介

JDBC 和 JPA

Page 21: Spring Data  简介

• 快速连接故障转移• 高级队列 JMS 支持和数据源的

简化配置• 消息传送和数据库访问的单一本

地事务

• 轻松访问本机 XML 、 Struct 、 Array 数据类型

• 用于自定义连接环境的 API

Spring Data JDBC 扩展 – Oracle 支持

Page 22: Spring Data  简介

QueryDSL

22

“支持为多个后端(包括 JPA 、 JDO 、MongoDB 、 Lucence 、 SQL 和 Java 中的普通集合)构造类型安全的类似 SQL 的查询

http://www.querydsl.com/ - 开源, Apache 2.0

Page 23: Spring Data  简介

• 使用字符串容易出错• 必须记住查询语法、域类、属性和关系• 按照名称或位置的冗长参数绑定• 每个后端都拥有其自身的查询语言和 API• 注释: .NET 含有 LINQ

使用字符串作为查询语言的问题

Page 24: Spring Data  简介

• 在 IDE 中完成编码• 几乎完全禁止语法无效的查询• 域类型和属性可以安全引用(无字符串)• 通过 Java 注释处理程序生成帮助程序类• 冗长性远小于 JPA2 标准的 API

QueryDSL 特性

24

QCustomer customer = QCustomer.customer;JPQLQuery query = new JPAQuery(entityManger)Customer bob = query.from(customer) .where(customer.firstName.eq(“Bob”) .uniqueResult(customer)

Page 25: Spring Data  简介

• 将代码生成融入到构建流程中– 以创建域类或表格 (JDBC) 的查询元数据模型

• 对于 SQL

将 QueryDSL 用于 JDBC

QAddress qAddress = QAddress.address;

SQLTemplates dialect = new HSQLDBTemplates();

SQLQuery query = new SQLQueryImpl(connection, dialect).from(qAddress).where(qAddress.city.eq("London"));

List<Address> results = query.list(new QBean<Address>(Address.class, qAddress.street, qAddress.city,

qAddress.country));Querydsl 判定

Page 26: Spring Data  简介

• 支持的 JdbcTemplate 打包程序– 使用 Querydsl SQLQuery 类来执行查询– 与 Spring 的事务管理集成– 自动检测数据库类型并设置 SQLTemplates 方言– 用于映射到 POJO 的 Spring RowMapper 和 ResultSetExtractors

– 通过 Querds 的 SQLInsertClause 、 SQLUpdateClause 和 SQLDeleteClause 执行插入、更新和删除

Spring JDBC 扩展 – QueryDslJdbcTemplate

Page 27: Spring Data  简介

Spring JDBC 扩展 – QueryDslJdbcTemplate// Query with joinQCustomer qCustomer = QCustomer.customer;SQLQuery findByIdQuery = qdslTemplate.newSqlQuery()

.from(qCustomer)

.leftJoin(qCustomer._addressCustomerRef, qAddress)

.where(qCustomer.id.eq(id));

Page 28: Spring Data  简介

JPA 和资源库

28

Page 29: Spring Data  简介

资源库

29

通过使用类似集合的接口来访问域对象,在域和数据映射层之间进行调解。http://martinfowler.com/eaaCatalog/repository.html

Page 30: Spring Data  简介

• 有了 Spring Data 资源库,您将不必忙于开发资源库

Spring Data 资源库

30

Page 31: Spring Data  简介

例如…public interface CustomerRepository {

Customer findOne(Long id);

Customer save(Customer customer);

Customer findByEmailAddress(EmailAddress emailAddress);}

@Entitypublic class Customer {

@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(unique = true) private EmailAddress emailAddress;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "customer_id") private Set<Address> addresses = new HashSet<Address>(); // constructor, properties, equals, hashcode omitted for brevity}

Page 32: Spring Data  简介

传统 JPA 实施@Repositorypublic class JpaCustomerRepository implements CustomerRepository {

@PersistenceContext private EntityManager em;

@Override public Customer findOne(Long id) { return em.find(Customer.class, id); }

public Customer save(Customer customer) { if (customer.getId() == null) { em.persist(customer); return customer; } else { return em.merge(customer); } }

...

Page 33: Spring Data  简介

传统 JPA 实施. . .

@Override public Customer findByEmailAddress(EmailAddress emailAddress) {

TypedQuery<Customer> query = em.createQuery("select c from Customer c where c.emailAddress = :email", Customer.class); query.setParameter("email", emailAddress);

return query.getSingleResult(); }}

Page 34: Spring Data  简介

• 简单的方法1. 使用 JPA 来映射 POJO

2. 扩展资源库(标记)接口或使用注释3. 添加查询程序方法4. 配置 Spring 来扫描资源库接口并创建实施

• 将实施注入到服务中,并正常使用…

Spring Data 资源库

Page 35: Spring Data  简介

Spring Data 资源库示例

public interface CustomerRepository extends Repository<Customer, Long> { // Marker Interface

Customer findOne(Long id);

Customer save(Customer customer);

Customer findByEmailAddress(EmailAddress emailAddress);}

@RepositoryDefinition(domainClass=Customer.class, idClass=Long.class)public interface CustomerRepository { . . . }

Page 36: Spring Data  简介

• 具有 JavaConfig 的 Boostratp

• 或 XML

• Spring 将创建接口实施

Spring Data 资源库示例

@Configuration@EnableJpaRepositories@Import(InfrastructureConfig.class)public class ApplicationConfig {

}

<jpa:repositories base-package="com.oreilly.springdata.jpa" />

Page 37: Spring Data  简介

• 正常地融入到事务服务层中

Spring Data JPA – 用法

Page 38: Spring Data  简介

• findByEmailAddres 的工作原理…

查询方法关键字

Page 39: Spring Data  简介

Spring Data 资源库 – CRUD

39

public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {

T save(T entity);

Iterable<T> save(Iterable<? extends T> entities);

T findOne(ID id);

boolean exists(ID id);

Iterable<T> findAll();

long count();

void delete(ID id);

void delete(T entity);

void delete(Iterable<? extends T> entities);

void deleteAll();}

Page 40: Spring Data  简介

切换、排序和自定义查找程序

40

public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort);

Page<T> findAll(Pageable pageable);}

Page 41: Spring Data  简介

• 查询方法使用方法命名约定– 可以用查询注释覆盖– 或者方法名称引用 JPA 命名的查询

Spring Data JPA –自定义查询方法

Page 42: Spring Data  简介

• 使用 JPA 标准的 API 进行指定• 锁定模式,覆盖事务元数据、查询提示• 审查、 CDI 集成• 支持 QueryDSL

Spring Data JPA – 其他特性

42

Page 43: Spring Data  简介

• 更简单、冗长性更低和 JPA2 标准的 API– “等于属性值”与“属性等于值”– 通过构建程序对象进行操作

Querydsl 和 JPA

CriteriaBuilder builder = entityManagerFactory.getCriteriaBuilder();CriteriaQuery<Person> query = builder.createQuery(Person.class);Root<Person> men = query.from( Person.class );Root<Person> women = query.from( Person.class );Predicate menRestriction = builder.and(

builder.equal( men.get( Person_.gender ), Gender.MALE ), builder.equal( men.get( Person_.relationshipStatus ),

RelationshipStatus.SINGLE ));

Predicate womenRestriction = builder.and( builder.equal( women.get( Person_.gender ), Gender.FEMALE ),

builder.equal( women.get( Person_.relationshipStatus ),RelationshipStatus.SINGLE ));

query.where( builder.and( menRestriction, womenRestriction ) );

Page 44: Spring Data  简介

与…

Querydsl 和 JPA

JPAQuery query = new JPAQuery(entityManager);QPerson men = new QPerson("men");QPerson women = new QPerson("women");

query.from(men, women).where(men.gender.eq(Gender.MALE), men.relationshipStatus.eq(RelationshipStatus.SINGLE),

women.gender.eq(Gender.FEMALE), women.relationshipStatus.eq(RelationshipStatus.SINGLE));

Querydsl 判定

Page 45: Spring Data  简介

QueryDSL – 资源库

45

public interface ProductRepository extends Repository<Product,Long>, QueryDslPredicateExecutor<Product> { … }

Product iPad = productRepository.findOne(product.name.eq("iPad"));

Predicate tablets = product.description.contains("tablet");

Iterable<Product> result = productRepository.findAll(tablets);

public interface QueryDSLPredicateExecutor<T> {

long count(com.mysema.query.types.Predicate predicate); T findOne(Predicate predicate);

List<T> findAll(Predicate predicate);

List<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);

Page<T> findAll(Predicate predicate, Pageable pageable);

}

Page 46: Spring Data  简介

工具支持

46

Page 47: Spring Data  简介

代码概览 – JPA

47

Page 48: Spring Data  简介

NoSQL 数据模型

48

Page 49: Spring Data  简介

• 比较熟悉,与哈希表格非常类似• Redis 、 Riak 、 Voldemort,…• 受 Amazon Dynamo 启发

键 / 值

49

Page 50: Spring Data  简介

• 扩展的键 / 值模型– 值可以为键 / 值对

• HBase 、 Cassandra• 受 Google Bigtable 启发

列系列

Page 51: Spring Data  简介

• 包含半结构化数据的集合: XML/JSON• CouchDB 、 MongoDB

文档

51

{ id: ‘4b2b9f67a1f631733d917a7b"),’ author: ‘joe’, tags : [‘example’, ‘db’], comments : [ { author: 'jim', comment: 'OK' }, { author: ‘ida', comment: ‘Bad' } ]

{ id: ‘4b2b9f67a1f631733d917a7c"), author: ‘ida’, ...

{ id: ‘4b2b9f67a1f631733d917a7d"), author: ‘jim’, ...

Page 52: Spring Data  简介

• 节点和边缘,每一个可能均具有属性• Neo4j 、 Sones 、 InfiniteGraph

图形

52

Page 53: Spring Data  简介

• 高级键值存储• 值可以为

– 字符串(例如在普通的键值存储中)。– 字符串列表,具有 O(1) pop 和 push 操作。– 字符串集,具有 O(1) 元素添加、删除和存在测试。– 有序集,类似于集,但是具有可将元素排序的评分。– 哈希,由设置为字符串值的字符串字段组成。

Redis

53

Page 54: Spring Data  简介

• 操作– 对每种数据类型均具有独特性 – 附加到列表 / 集,检索列表的

一部分…– 许多操作在 (1) 时间执行 – 入门级硬件上为 10 万操作 /秒– 集的交集、联合、区别– Redis 是单线程的原子操作

• 可选持久性• 主从复制• HA 支持即将推出

Redis

54

Page 55: Spring Data  简介

• 在多个驱动程序上提供“实际的” API• RedisTemplate

– 连接资源管理– 描述性方法名称,分组为数据类型类别

• ListOps、 ZSetOps、 HashOps…

– 无需处理字节数组• 支持 Java JDK 、字符串、 JSON 、 XML 和自定义序列化

– 转换为 Spring 的 DataAccessException 层次结构• 以 Redis 为后盾的集、列表、映射、具有限制的集合、原子计数器• Redis 消息• Spring 3.1 @Cacheable 支持

Spring Data Redis

55

Page 56: Spring Data  简介

• 列表操作

RedisTemplate

56

@AutowiredRedisTemplate<String, Person> redisTemplate;

Person p = new Person("George", "Carlin");redisTemplate.opsForList().leftPush("hosts", p);

Page 57: Spring Data  简介

• JDK 集合( java.util 和 java.util.concurrent)– 列表 / 集 /(阻塞)队列 /(阻塞)双队列

• 原子计数器– 以 Redis 为后盾的 AtomicLong 和 AtomicInteger

Redis 支持类

57

Set<String> t = new DefaultRedisSet<String>(“timeline“, connection);t.add(new Post("john", "Hello World"));

RedisSet<String> fJ = new DefaultRedisSet<String>("john:following", template);RedisSet<String> fB = new DefaultRedisSet<String>("bob:following", template);

// followers in commonSet s3 = fJ.intersect(fB);

Page 58: Spring Data  简介

代码概览 – Redis

58

Page 59: Spring Data  简介

• 面向列的数据库– 指向实际为键值对的“列”– 列可以全部分组为“列系列”

• 已优化的存储和 I/O

• 存储在模仿 Google BigTable 而来的 HDFS 中的数据• 需要首先定义列系列的架构

– 列系列内的键值对不用首先定义

HBase

59

Page 60: Spring Data  简介

使用 HBase

60

$ ./bin/hbase shell> create 'users', { NAME => 'cfInfo'}, { NAME => 'cfStatus' }> put 'users', 'row-1', 'cfInfo:qUser', 'user1'> put 'users', 'row-1', 'cfInfo:qEmail', '[email protected]'> put 'users', 'row-1', 'cfInfo:qPassword', 'user1pwd'> put 'users', 'row-1', 'cfStatus:qEmailValidated', 'true‘> scan 'users'ROW COLUMN+CELLrow-1 column=cfInfo:qEmail, timestamp=1346326115599, [email protected] column=cfInfo:qPassword, timestamp=1346326128125, value=user1pwdrow-1 column=cfInfo:qUser, timestamp=1346326078830, value=user1row-1 column=cfStatus:

Configuration configuration = new Configuration(); // Hadoop configuration objectHTable table = new HTable(configuration, "users");Put p = new Put(Bytes.toBytes("user1"));p.add(Bytes.toBytes("cfInfo"), Bytes.toBytes("qUser"), Bytes.toBytes("user1"));table.put(p);

Page 61: Spring Data  简介

• HTable 类并非线程安全• 引发特定于 HBase 的异常

HBase API

61

Configuration configuration = new Configuration(); // Hadoop configuration HTable table = new HTable(configuration, "users");Put p = new Put(Bytes.toBytes("user1"));p.add(Bytes.toBytes("cfInfo"), Bytes.toBytes("qUser"), Bytes.toBytes("user1"));p.add(Bytes.toBytes("cfInfo"), Bytes.toBytes("qEmail"), Bytes.toBytes("[email protected]"));p.add(Bytes.toBytes("cfInfo"), Bytes.toBytes("qPassword"), Bytes.toBytes("user1pwd"));table.put(p);

Page 62: Spring Data  简介

• 配置支持• HBaseTemplate

– 资源管理– 转换为 Spring 的 DataAccessException 层次结构– 轻量对象映射类似于 JdbcTemplate

• RowMapper 、 ResultsExtractor

– 访问底层资源• TableCallback

Spring Hadoop - HBase

62

Page 63: Spring Data  简介

HBaseTemplate – 配置

63

<configuration id="hadoopConfiguration"> fs.default.name=hdfs://localhost:9000</configuration>

<hbase-configuration id="hbaseConfiguration" configuration-ref="hadoopConfiguration" />

<beans:bean id="hbaseTemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate"> <beans:property name="configuration" ref="hbaseConfiguration" /></beans:bean>

Page 64: Spring Data  简介

HBaseTemplate – 保存

64

public User save(final String userName, final String email, final String password) { return hbaseTemplate.execute(tableName, new TableCallback<User>() { public User doInTable(HTable table) throws Throwable { User user = new User(userName, email, password); Put p = new Put(Bytes.toBytes(user.getName())); p.add(CF_INFO, qUser, Bytes.toBytes(user.getName())); p.add(CF_INFO, qEmail, Bytes.toBytes(user.getEmail())); p.add(CF_INFO, qPassword, Bytes.toBytes(user.getPassword())); table.put(p); return user; } });}

Page 65: Spring Data  简介

HBaseTemplate – POJO 映射

65

private byte[] qUser = Bytes.toBytes("user");private byte[] qEmail = Bytes.toBytes("email");private byte[] qPassword = Bytes.toBytes("password");

public List<User> findAll() { return hbaseTemplate.find(tableName, "cfInfo", new RowMapper<User>() { @Override public User mapRow(Result result, int rowNum) throws Exception { return new User(Bytes.toString(result.getValue(CF_INFO, qUser)), Bytes.toString(result.getValue(CF_INFO, qEmail)), Bytes.toString(result.getValue(CF_INFO, qPassword))); } });}

Page 66: Spring Data  简介

代码概览 – HBase

66

Page 67: Spring Data  简介

• 文档数据库– JSON 风格的文档– 无架构

• 组织在集合中的文档• 全部或部分文档更新• 索引支持 – 辅助和复合• 动态查询的丰富查询语言• 用于高效存储大型文件的 GridFS• 地理空间功能• 聚合查询的映射 / 缩减

– 2.2 中的新聚合框架• 复制和自动分区

MongoDB

67

Page 68: Spring Data  简介

• MongoTemplate– 流畅的查询、标准、更新 API

– 转换为 Spring 的 DataAccessException 层次结构• GridFSTemplate• 资源库• QueryDSL• 跨存储持久性• JMX• Log4J 登录适配器

Spring Data – MongoDB

68

Page 69: Spring Data  简介

MongoOperations 接口

69

Page 70: Spring Data  简介

MongoTemplate – 用法

70

Page 71: Spring Data  简介

• 示例文档

• MapFunction – 对每个字母在数组中出现的次数进行计数

MongoTemplate – MapReduce

71

{ "_id" : ObjectId("4e5ff893c0277826074ec533"), "x" : [ "a", "b" ] }{ "_id" : ObjectId("4e5ff893c0277826074ec534"), "x" : [ "b", "c" ] }{ "_id" : ObjectId("4e5ff893c0277826074ec535"), "x" : [ "c", "d" ] }

function () { for (var i = 0; i < this.x.length; i++) { emit(this.x[i], 1); }}

Page 72: Spring Data  简介

• Reduce Function – 计算每个字母在所有文档中出现次数的总和

• 执行 MapReduce

MongoTemplate – MapReduce

72

function (key, values) { var sum = 0; for (var i = 0; i < values.length; i++) sum += values[i]; return sum;}

MapReduceResults<ValueObject> results = mongoOperations.mapReduce("collection", "classpath:map.js",

"classpath:reduce.js", ValueObject.class);

Page 73: Spring Data  简介

• @Document– 标记要映射到文档的实体(可选)– 允许对实体应持久保留的集合进行定义– 集合名称默认为简单的类名称

• @Id– 区分 ID 属性– 自动检测到名称 ID 和 _id 的属性

映射注释

73

Page 74: Spring Data  简介

• @Index / @CompoundIndex– 为一个或多个属性创建索引

• @Field– 允许自定义要在文档内使用的键– 定义字段顺序

• @DBRef– 在不同集合内创建实体引用– 相反于在文档中嵌入实体(默认)

映射注释

74

Page 75: Spring Data  简介

• 与之前 JPA 的相同• 添加了特定于 MongoDB 的功能

– Geolocation 、 @Query

Mongo 资源库

75

Page 76: Spring Data  简介

代码概览 – Mongo

76

Page 77: Spring Data  简介

• 图形数据库 – 专注于已连接的数据– 社交图…

• 无架构的属性图• ACID 事务• 索引• 约 340 亿可扩展的节点和关系,约 1M/ 遍历 /秒• REST API 或可在 JVN 上嵌入• 高可用性• 公布的查询语言 – Cypher

Neo4j

77

Page 78: Spring Data  简介

• 使用注释定义图形实体• 以图形数据库为后盾的实体状态

• JSR-303 Bean 验证• 查询和遍历 API 支持• 跨存储持久性

– 部分对象位于 RDBMS ,其他对象位于 Neo4j

• 异常转换• 公布的事务管理• 资源库• QueryDSL• Spring XML 命名空间• Neo4j-Server 支持

Spring Data Neo4j

78

Page 79: Spring Data  简介

经典 Neo4j 域类

79

Page 80: Spring Data  简介

Spring Data Neo4j 域类

80

@NodeEntitypublic class Tag { @GraphId private Long id; @Indexed(unique = true) private String name;}

Page 81: Spring Data  简介

• @NodeEntity– 代表图形中的一个节点– 另存为节点上属性的字段– 使用 Java“ 新”关键字(例

如任何 POJO) 的实例化– 同样由查询机制返回– 存储在图形中的类型信息

Spring Data Neo4j 域类

81

@NodeEntitypublic class Tag { @GraphId private Long id; @Indexed(unique = true) private String name;}

Page 82: Spring Data  简介

Spring Data Neo4j 域类

82

@NodeEntitypublic class Customer {

@GraphId private Long id; private String firstName, lastName;

@Indexed(unique=true) private String emailAddress;

@RelatedTo(type=“ADDRESS”) private Set<Address> addresses = new HashSet<Address>();}

Page 83: Spring Data  简介

• 资源管理• 便利方法• 公布的事务管理• 异常转换为 DataAccessException 层次结构• 同样通过具有 Neo4j-Server 的 REST 起作用• 多种查询语言

– Cypher 、 Gremlin

• 流畅的查询结果处理

Neo4jTemplate

83

Page 84: Spring Data  简介

• 在应用程序中隐式地创建 Neo4jTemplate 实例

Neo4jTemplate – 用法

84

Customer dave = neo4jTemplate.save(new Customer("Dave", "Matthews", "[email protected]"));

Product iPad = neo4jTemplate.save(new Product("iPad", "Apple tablet device").withPrice(499));

Product mbp = neo4jTemplate.save(new Product("MacBook Pro", "Apple notebook").withPrice(1299));

neo4jTemplate.save(new Order(dave).withItem(iPad,2).withItem(mbp,1));

<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase"> <constructor-arg value="http://localhost:7474/db/data" /></bean>

<neo4j:config graphDatabaseService="graphDatabaseService" />

Page 85: Spring Data  简介

• 通过 REST 语义导出 CrudRepository 方法– PUT, POST = save()

– GET = find*()

– DELETE = delete*()

• 支持作为一流数据格式的 JSON• JSONP 和 JSONP+E 支持• 作为 Spring MVC 应用程序实施

Spring Data REST

85

Page 86: Spring Data  简介

• 可发现性– 此级别可用的资源列表中的“ GET /” 结果

• 资源之间通过“链接”相互关联– 链接在不同上下文中具有特定的意思– HTML 和原子联合格式具有 <link rel=“” href=“”/>

• 将 Spring HATEOAS 用作创建表示的基础– https://github.com/SpringSource/spring-hateoas

Spring Data REST

86

Page 87: Spring Data  简介

Spring Data REST – 示例

87

curl -v http://localhost:8080/spring-data-rest-webmvc/{ "links" : [{ "rel" : "person", "href" : "http://localhost:8080/spring-data-rest-webmvc/person" }]}

curl -v http://localhost:8080/spring-data-rest-webmvc/person

{ "content": [ ], "links" : [ { "rel" : "person.search", "href" : "http://localhost:8080/spring-data-rest-webmvc/person/search" } ]}

Page 88: Spring Data  简介

Spring Data REST – 示例

88

curl -v http://localhost:8080/spring-data-rest-webmvc/person/search

{ "links" : [ { "rel" : "person.findByName", "href" : "http://localhost:8080/spring-data-rest-webmvc/person/search/findByName" } ]}

curl -v http://localhost:8080/spring-data-rest-webmvc/person/search/findByName?name=John+Doe

[ { "rel" : "person.Person", "href" : "http://localhost:8080/spring-data-rest-webmvc/person/1"} ]

Page 89: Spring Data  简介

Spring Data REST – 示例

89

curl -v http://localhost:8080/spring-data-rest-webmvc/person/1

{ "name" : "John Doe", "links" : [ { "rel" : "profiles", "href" : "http://localhost:8080/spring-data-rest-webmvc/person/1/profiles" }, { "rel" : "addresses", "href" : "http://localhost:8080/spring-data-rest-webmvc/person/1/addresses" }, { "rel" : "self", "href" : "http://localhost:8080/spring-data-rest-webmvc/person/1" } ], "version" : 1}

Page 90: Spring Data  简介

• Hadoop 现成的编程模型效果较差

• 应用程序通常为调用命令行应用的脚本集合

• Spring 简化了 Hadoop 应用程序的开发

• 通过提供熟悉并一致的编程和配置模型

• 可用于多种使用情形– HDFS 使用– 数据分析

(MR/Pig/Hive/Cascading)• PigTemplate• HiveTemplate

– 工作流 (Spring Batch)– 事件流 (Spring Integration)

• 让您能够从小处开始并取得发展

Spring for Hadoop – 目标

90

Page 91: Spring Data  简介

与其他 Spring 项目的关系

91

Page 92: Spring Data  简介

书籍

92

免费的 Spring Data JPA 章节 – http://bit.ly/sd-book-chapter

O’Reilly Spring Data 书籍 – http://bit.ly/sd-book

Page 93: Spring Data  简介

• Spring Data– http://www.springsource.org/spring-data– http://www.springsource.org/spring-hadoop

• Querydsl– http://www.querydsl.com

• 示例代码– https://github.com/SpringSource/spring-data-book– https://github.com/SpringSource/spring-data-kickstart– 各个项目页面上列出了更多示例

资源

93

Page 94: Spring Data  简介

谢谢!