Data Access 2.0?     …please welcome…  Spring Data!        Oliver Gierke
Oliver GierkeSpring DataCore/JPA/MongoDBogierke@vmware.comwww.olivergierke.deolivergierke
What to expect?
How?Why?        What?
A Developer‘s View
What to expect?     NOT!
What to expect?     NOT!
Retrospect
Relational databases
Scaling
Data structures
Hibari Voldemort   Membase               Riak    Cassandra    RedisSimpleDB    (No)SQL            MongoDB            Orien...
Key Value
Column families
Graphs
Documents
Document database JSON documents   JSON queries
MongoDB Infrastructure API     Mongo mongo = new Mongo(…);     DB db = mongo.getDB("myDatabase");     Collection collectio...
MongoDB Query API Mongo mongo = new Mongo(…); DB db = mongo.getDB("myDatabase"); Collection collection = db.getCollection(...
Graph database    Nodes / RelationshipsTraversals / Cypher / Gremlin
Neo4J Infrastructure API     GraphDatabaseService database = new EmbeddedGraphDatabase(…);     Transaction tx = database.b...
Neo4J Query API     GraphDatabaseService database = new EmbeddedGraphDatabase(…);     CypherParser parser = new CypherPars...
Neo4J entity     class Actor {         private final Node node;         public Actor(Node node) { … }         public String...
Forest for the woods?
JPA?
"    This document is the specification of the    Java API for the management of    persistence and object/relational mappi...
"    This document is the specification of the    Java API for the management of    persistence and object/relational mappi...
JPA?
There‘s someSpring for that!
Spring Data
"   … provide a familiar and    consistent Spring-based    programming model while    retaining store-specific    features ...
Spring Data  JDBC   JPA
Spring Data  JDBC   JPA
Spring Data  JDBC   JPA
Spring Data  JDBC   JPA
Building blocks
Spring
Mapping
JPA entity mapping @Entity class Person {     @Id     @GeneratedValue(strategy=GenerationType.AUTO)     private BigInteger...
Entity mapping - MongoDB     @Document     class Person {         @Id private BigInteger id;         @Indexed private Stri...
Entity mapping - Neo4J     @NodeEntity     class Person {         @GraphId private long id;         @Indexed private Strin...
Templates
MongoOperations / -Template public interface MongoOperations {     // Generic callback-accepting methods     <T> T execute...
MongoTemplate usage     // Setup infrastructure     Mongo mongo = new Mongo();     MongoDbFactory factory = new SimpleMong...
Repositories
Repositories - JPA     <jpa:repositories base-package="com.acme.repositories" />     public interface PersonRepository ext...
Repositories - MongoDB     public interface PersonRepository extends Repository<Person, BigInteger>     {       // Finder ...
Repositories - MongoDB     <mongo:repositories base-package="com.acme.repositories" />     @Component     public class MyC...
Repositories - Neo4J interface PersonRepository extends GraphRepository<Person, Long>    // Finder for a single entity    ...
Repositories        Querydsl51
Querydsl     QPerson $ = QPerson.person;     BooleanExpression left = $.lastname.contains("eth");     BooleanExpression ri...
Wrap up
Wrap upSophisticated mapping support           Templates         Repositories            Querydsl      Spring namespaceGeo...
Questions?
Resources•   www.springframework.org/spring-data•   github.com/SpringSource/spring-data-mongodb•   github.com/SpringSource...
Data access 2.0? Please welcome: Spring Data!
Upcoming SlideShare
Loading in...5
×

Data access 2.0? Please welcome: Spring Data!

2,634

Published on

Slides of my talk @ JAX 2012

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,634
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
58
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Data access 2.0? Please welcome: Spring Data!

  1. 1. Data Access 2.0? …please welcome… Spring Data! Oliver Gierke
  2. 2. Oliver GierkeSpring DataCore/JPA/MongoDBogierke@vmware.comwww.olivergierke.deolivergierke
  3. 3. What to expect?
  4. 4. How?Why? What?
  5. 5. A Developer‘s View
  6. 6. What to expect? NOT!
  7. 7. What to expect? NOT!
  8. 8. Retrospect
  9. 9. Relational databases
  10. 10. Scaling
  11. 11. Data structures
  12. 12. Hibari Voldemort Membase Riak Cassandra RedisSimpleDB (No)SQL MongoDB OrientDB CouchDB HBase Sones Neo4J
  13. 13. Key Value
  14. 14. Column families
  15. 15. Graphs
  16. 16. Documents
  17. 17. Document database JSON documents JSON queries
  18. 18. 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);19
  19. 19. 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 }20
  20. 20. Graph database Nodes / RelationshipsTraversals / Cypher / Gremlin
  21. 21. 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(); }22
  22. 22. 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 }23
  23. 23. Neo4J entity class Actor { private final Node node; public Actor(Node node) { … } public String getName() { return (String) node.getProperty(„name“); } … }24
  24. 24. Forest for the woods?
  25. 25. JPA?
  26. 26. " This document is the specification of the Java API for the management of persistence and object/relational mapping with Java EE and Java SE. The technical objective of this work is to provide an object/relational mapping facility for the Java application developer using a Java domain model to man- age a relational database.
  27. 27. " This document is the specification of the Java API for the management of persistence and object/relational mapping with Java EE and Java SE. The technical objective of this work is to provide an object/relational mapping facility for the Java application developer using a Java domain model to man- age a relational database.
  28. 28. JPA?
  29. 29. There‘s someSpring for that!
  30. 30. Spring Data
  31. 31. " … provide a familiar and consistent Spring-based programming model while retaining store-specific features and capabilities.
  32. 32. Spring Data JDBC JPA
  33. 33. Spring Data JDBC JPA
  34. 34. Spring Data JDBC JPA
  35. 35. Spring Data JDBC JPA
  36. 36. Building blocks
  37. 37. Spring
  38. 38. Mapping
  39. 39. JPA entity mapping @Entity class Person { @Id @GeneratedValue(strategy=GenerationType.AUTO) private BigInteger id; private String firstname, lastname; @Column(name="email") private String emailAddress; @OneToMany private Set<Person> colleagues; }40
  40. 40. Entity mapping - MongoDB @Document class Person { @Id private BigInteger id; @Indexed private String firstname, lastname; @Field("email") private String emailAddress; @DBRef private Set<Person> colleagues; public Person(String firstname) { … } @PersistenceConstructor public Person(String firstname, String lastname) { … } … }41
  41. 41. Entity mapping - Neo4J @NodeEntity class Person { @GraphId private long id; @Indexed private String firstname, lastname; @RelatedTo(direction = Direction.INCOMING) private Set<Person> colleagues; public Person(String firstname) { … } @PersistenceConstructor public Person(String firstname, String lastname) { … } … }42
  42. 42. Templates
  43. 43. 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); }44
  44. 44. MongoTemplate usage // Setup infrastructure Mongo mongo = new Mongo(); MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „foo“); MongoTemplate template = new MongoTemplate(factory); // Create and save entity Person dave = new Person("Dave", "Matthews"); dave.setEmailAddress("dave@dmband.com"); template.save(person); // Query entity Query query = new Query(new Criteria("emailAddress") .is("dave@dmband.com")); assertThat(template.find(query), is(dave));45
  45. 45. Repositories
  46. 46. Repositories - JPA <jpa:repositories base-package="com.acme.repositories" /> public interface PersonRepository extends Repository<Person, BigInteger> { // Finder for a single entity Person findByEmailAddress(String emailAddress); // Finder for multiple entities List<Person> findByLastnameLike(String lastname); // Finder with pagination Page<Person> findByFirstnameLike(String firstname, Pageable page); }47
  47. 47. Repositories - MongoDB public interface PersonRepository extends Repository<Person, BigInteger> { // Finder for a single entity Person findByEmailAddress(String emailAddress); // Finder for multiple entities List<Person> findByLastnameLike(String lastname); // Finder with pagination Page<Person> findByFirstnameLike(String firstname, Pageable page); // Geospatial queries List<Person> findByLocationNear(Point location, Distance distance); GeoResults<Person> findByLocationNear(Point location); }48
  48. 48. Repositories - MongoDB <mongo:repositories base-package="com.acme.repositories" /> @Component public class MyClient { @Autowired private 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); } }49
  49. 49. Repositories - Neo4J interface PersonRepository extends GraphRepository<Person, Long> // Finder for a single entity Person findByEmailAddress(String emailAddress); // Finder for multiple entities List<Person> findByLastnameLike(String lastname); // Finder with pagination Page<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); }50
  50. 50. Repositories Querydsl51
  51. 51. 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));52
  52. 52. Wrap up
  53. 53. Wrap upSophisticated mapping support Templates Repositories Querydsl Spring namespaceGeospatial support (MongoDB) Cross-store persistence
  54. 54. Questions?
  55. 55. Resources• www.springframework.org/spring-data• github.com/SpringSource/spring-data-mongodb• github.com/SpringSource/spring-data-neo4j• http://www.se-radio.net/2010/07/episode-165-nosql-and- mongodb-with-dwight-merriman• http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×