Top Banner
Data Access 2.0? …please welcome… Spring Data! Oliver Gierke
52

An introduction into Spring Data

May 09, 2015

Download

Technology

Oliver Gierke

Slides of my talk at OOP2012.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: An introduction into Spring Data

Data Access 2.0?…please welcome…

Spring Data!

Oliver Gierke

Page 3: An introduction into Spring Data

What to expect?

Page 4: An introduction into Spring Data

Why?

How?

What?

Page 5: An introduction into Spring Data

A Developer‘s View

Page 6: An introduction into Spring Data

What to expect?NOT!

Page 7: An introduction into Spring Data

What to expect? NOT!

Page 8: An introduction into Spring Data

Overview

Page 9: An introduction into Spring Data

Relational databases

Page 10: An introduction into Spring Data

Scaling

Page 11: An introduction into Spring Data

Data structures

Page 12: An introduction into Spring Data

(No)SQLRedis

Riak

MongoDB

Cassandra

CouchDB

Neo4JHBase

SimpleDB

OrientDB

MembaseHibari Voldemort

Sones

Page 13: An introduction into Spring Data

Key Value

Page 14: An introduction into Spring Data

Column families

Page 15: An introduction into Spring Data

Graphs

Page 16: An introduction into Spring Data

Documents

Page 17: An introduction into Spring Data
Page 18: An introduction into Spring Data

Document databaseJSON documents

JSON queries

Page 19: An introduction into Spring Data

19

MongoDB Infrastructure API

Mongo mongo = new Mongo(…);DB db = mongo.getDB("myDatabase");Collection collection = db.getCollection("myCollection");

DBObject address = new BasicDBObject();address.put("city", "London");

DBObject person = new BasicDBObject();person.put("firstname", "Dave");person.put("lastname", "Matthews");person.put("address", address);

collection.save(person);

Page 20: An introduction into Spring Data

20

MongoDB Query API

Mongo mongo = new Mongo(…);DB db = mongo.getDB("myDatabase");Collection collection = db.getCollection("myCollection");

DBObject query = new BasicDBObject();query.put("address.city", "London");

DBCursor cursor = collection.find(query);

for (DBObject element : cursor) { // Map data onto object}

Page 21: An introduction into Spring Data

Graph databaseNodes / Relationships

Traversals / Cypher / Gremlin

Page 22: An introduction into Spring Data

22

Neo4J Infrastructure API

GraphDatabaseService database = new EmbeddedGraphDatabase(…);Transaction tx = database.beginTx();

try {Node mrAnderson = database.createNode();mrAnderson.setProperty("name", "Thomas Anderson");Node morpheus = database.createNode();morpheus.setProperty("name", "Morpheus");

Relationship friendship = mrAnderson.createRelationshipTo(morpheus, FriendTypes.KNOWS);

tx.success();} finally {

tx.finish();}

Page 23: An introduction into Spring Data

23

Neo4J Query API

GraphDatabaseService database = new EmbeddedGraphDatabase(…);

CypherParser parser = new CypherParser();Query query = parser.parse("start person = Person(id = *) match " +

"person-[:colleagues]->colleague where colleague.firstname = {name}");

Map<String, Object> parameters = new HashMap<String, Object>();parameters.put("name", "Dave");

ExecutionEngine engine = new ExecutionEngine(database);ExecutionResult result = engine.execute(query, parameters);

for (EntrySet<String, Object> element : result) {// Map data onto object

}

Page 24: An introduction into Spring Data

24

Neo4J entity

class Actor {

private final Node node;

public Actor(Node node) { … }

public String getName() {return (String) node.getProperty(„name“);

}

…}

Page 25: An introduction into Spring Data

Forest for the woods?

Page 26: An introduction into Spring Data

There‘s someSpring for that!

Page 27: An introduction into Spring Data

Spring Data

Page 28: An introduction into Spring Data

"… provide a familiar and consistent Spring-based programming model while retaining store-specific features and capabilities.

Page 29: An introduction into Spring Data

Spring Data

JPAJDBC

Page 30: An introduction into Spring Data

Spring Data

JPAJDBC

Page 31: An introduction into Spring Data

Spring Data

JPAJDBC

Page 32: An introduction into Spring Data

Spring Data

JPAJDBC

Page 33: An introduction into Spring Data

Building blocks

Page 34: An introduction into Spring Data

Spring

Page 35: An introduction into Spring Data

Mapping

Page 36: An introduction into Spring Data

36

JPA entity mapping

@Entityclass Person {

@Id@GeneratedValue(strategy=GenerationType.AUTO)private BigInteger id;private String firstname, lastname;

@Column(name="email") private String emailAddress;

@OneToMany private Set<Person> colleagues;

}

Page 37: An introduction into Spring Data

37

Entity mapping - MongoDB

@Documentclass Person {

@Id private BigInteger id;@Indexed private String firstname, lastname;@Field("email") private String emailAddress;@DBRef private Set<Person> colleagues;

public Person(String firstname) { … }

@PersistenceConstructorpublic Person(String firstname, String lastname) { … }

…}

Page 38: An introduction into Spring Data

38

Entity mapping - Neo4J

@NodeEntityclass Person {

@GraphId private long id;@Indexed private String firstname, lastname;@RelatedTo(direction = Direction.INCOMING)private Set<Person> colleagues;

public Person(String firstname) { … }

@PersistenceConstructorpublic Person(String firstname, String lastname) { … }

…}

Page 39: An introduction into Spring Data

Templates

Page 40: An introduction into Spring Data

40

MongoOperations / -Template

public interface MongoOperations {

// Generic callback-accepting methods <T> T execute(DbCallback<T> action);

<T> T execute(Class<?> entityClass, CollectionCallback<T> action);<T> T execute(String collectionName, CollectionCallback<T> action);

// Higher level access methods<T> List<T> find(Query query, Class<T> entityClass);void save(Object objectToSave, String collectionName);WriteResult updateFirst(Query query, Update update, Class<?>

entityClass);

// Geo API<T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass);

}

Page 41: An introduction into Spring Data

41

MongoTemplate usage

// Setup infrastructureMongo mongo = new Mongo();MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „foo“);MongoTemplate template = new MongoTemplate(factory);

// Create and save entityPerson dave = new Person("Dave", "Matthews");dave.setEmailAddress("[email protected]");template.save(person);

// Query entityQuery query = new Query(new Criteria("emailAddress")

.is("[email protected]"));assertThat(template.find(query), is(dave));

Page 42: An introduction into Spring Data

Repositories

Page 43: An introduction into Spring Data

43

Repositories - JPA

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

public interface PersonRepository extends Repository<Person, BigInteger>{

// Finder for a single entityPerson findByEmailAddress(String emailAddress);

// Finder for multiple entitiesList<Person> findByLastnameLike(String lastname);

// Finder with paginationPage<Person> findByFirstnameLike(String firstname, Pageable page);

}

Page 44: An introduction into Spring Data

44

Repositories - MongoDB

public interface PersonRepository extends Repository<Person, BigInteger>{

// Finder for a single entityPerson findByEmailAddress(String emailAddress);

// Finder for multiple entitiesList<Person> findByLastnameLike(String lastname);

// Finder with paginationPage<Person> findByFirstnameLike(String firstname, Pageable page);

// Geospatial queriesList<Person> findByLocationNear(Point location, Distance distance);GeoResults<Person> findByLocationNear(Point location);

}

Page 45: An introduction into Spring Data

45

Repositories - MongoDB

<mongo:repositories base-package="com.acme.repositories" />

@Componentpublic class MyClient {

@Autowiredprivate PersonRepository repository;

public List<Person> doSomething() {

Point point = new Point(43.7, 48.8);Distance distance = new Distance(200, Metrics.KILOMETERS);return repository.findByLocationNear(point, distance);

}}

Page 46: An introduction into Spring Data

46

Repositories - Neo4J

interface PersonRepository extends GraphRepository<Person, Long> // Finder for a single entityPerson findByEmailAddress(String emailAddress);

// Finder for multiple entitiesList<Person> findByLastnameLike(String lastname);

// Finder with paginationPage<Person> findByFirstnameLike(String firstname, Pageable page);

@Query("start person = Person(id = *) " + "match person-[:colleagues]->colleague where " + "colleague.firstname = {name}")List<Person> getPersonsWithColleaguesName( @Param("name") Movie m);

}

Page 47: An introduction into Spring Data

Repositories

47

Querydsl

Page 48: An introduction into Spring Data

48

Querydsl

QPerson $ = QPerson.person;BooleanExpression left = $.lastname.contains("eth");BooleanExpression right = $.firstname.is("Carter");

public interface QueryDslPredicateExecutor<T> {T findOne(Predicate predicate);List<T> findAll(Predicate predicate);

}

public interface PersonRepository extends Repository<Person, BigInteger>,QueryDslPredicateExecutor { … }

List<Person> result = repository.findAll(left.or(right));assertThat(result.size(), is(2));assertThat(result, hasItems(dave, carter));

Page 49: An introduction into Spring Data

Wrap up

Page 50: An introduction into Spring Data

Sophisticated mapping supportTemplates

RepositoriesQuerydsl

Spring namespaceGeospatial support (MongoDB)

Cross-store persistence

Wrap up

Page 51: An introduction into Spring Data

Questions?