SlideShare una empresa de Scribd logo
1 de 56
Descargar para leer sin conexión
Data Access 2.0?
     …please welcome…


  Spring Data!

        Oliver Gierke
Oliver Gierke

Spring Data
Core/JPA/MongoDB

ogierke@vmware.com
www.olivergierke.de
olivergierke
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
    Redis
SimpleDB    (No)SQL            MongoDB

            OrientDB      CouchDB
   HBase
                       Sones
            Neo4J
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 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
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
Graph database
    Nodes / Relationships
Traversals / Cypher / Gremlin
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
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
Neo4J entity

     class Actor {

         private final Node node;

         public Actor(Node node) { … }

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

         …
     }




24
Forest for the woods?
JPA?
"
    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.
"
    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.
JPA?
There‘s some
Spring for that!
Spring Data
"   … provide a familiar and
    consistent Spring-based
    programming model while
    retaining store-specific
    features and capabilities.
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 id;
     private String firstname, lastname;

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

     @OneToMany
     private Set<Person> colleagues;
 }




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
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
Templates
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
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
Repositories
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
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
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
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
Repositories
        Querydsl




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
Wrap up
Wrap up
Sophisticated mapping support
           Templates
         Repositories
            Querydsl
      Spring namespace
Geospatial support (MongoDB)
   Cross-store persistence
Questions?
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

Más contenido relacionado

La actualidad más candente

Wed 1630 greene_robert_color
Wed 1630 greene_robert_colorWed 1630 greene_robert_color
Wed 1630 greene_robert_color
DATAVERSITY
 
Indexing & Query Optimization
Indexing & Query OptimizationIndexing & Query Optimization
Indexing & Query Optimization
MongoDB
 
Indexing and Query Optimization
Indexing and Query OptimizationIndexing and Query Optimization
Indexing and Query Optimization
MongoDB
 
Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)
MongoSF
 
Symfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMSymfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODM
Jonathan Wage
 

La actualidad más candente (20)

Wed 1630 greene_robert_color
Wed 1630 greene_robert_colorWed 1630 greene_robert_color
Wed 1630 greene_robert_color
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
Green dao
Green daoGreen dao
Green dao
 
Reducing Development Time with MongoDB vs. SQL
Reducing Development Time with MongoDB vs. SQLReducing Development Time with MongoDB vs. SQL
Reducing Development Time with MongoDB vs. SQL
 
GreenDao Introduction
GreenDao IntroductionGreenDao Introduction
GreenDao Introduction
 
Fast querying indexing for performance (4)
Fast querying   indexing for performance (4)Fast querying   indexing for performance (4)
Fast querying indexing for performance (4)
 
2001: JNDI Its all in the Context
2001:  JNDI Its all in the Context2001:  JNDI Its all in the Context
2001: JNDI Its all in the Context
 
Ajax chap 5
Ajax chap 5Ajax chap 5
Ajax chap 5
 
Indexing & Query Optimization
Indexing & Query OptimizationIndexing & Query Optimization
Indexing & Query Optimization
 
Ajax chap 4
Ajax chap 4Ajax chap 4
Ajax chap 4
 
Indexing and Query Optimization
Indexing and Query OptimizationIndexing and Query Optimization
Indexing and Query Optimization
 
Softshake - Offline applications
Softshake - Offline applicationsSoftshake - Offline applications
Softshake - Offline applications
 
Implementing CQRS and Event Sourcing with RavenDB
Implementing CQRS and Event Sourcing with RavenDBImplementing CQRS and Event Sourcing with RavenDB
Implementing CQRS and Event Sourcing with RavenDB
 
MongoDB and Indexes - MUG Denver - 20160329
MongoDB and Indexes - MUG Denver - 20160329MongoDB and Indexes - MUG Denver - 20160329
MongoDB and Indexes - MUG Denver - 20160329
 
Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)
 
ObjectBox - The new Mobile Database
ObjectBox - The new Mobile DatabaseObjectBox - The new Mobile Database
ObjectBox - The new Mobile Database
 
Spring framework part 2
Spring framework part 2Spring framework part 2
Spring framework part 2
 
Symfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMSymfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODM
 
Jndi (1)
Jndi (1)Jndi (1)
Jndi (1)
 

Destacado

Whoops! where did my architecture go?
Whoops! where did my architecture go?Whoops! where did my architecture go?
Whoops! where did my architecture go?
Oliver Gierke
 
Spring Data and MongoDB
Spring Data and MongoDBSpring Data and MongoDB
Spring Data and MongoDB
Oliver Gierke
 
Real world dependency injection - DPC10
Real world dependency injection - DPC10Real world dependency injection - DPC10
Real world dependency injection - DPC10
Stephan Hochdörfer
 
Data Access 2.0? Please welcome, Spring Data!
Data Access 2.0? Please welcome, Spring Data!Data Access 2.0? Please welcome, Spring Data!
Data Access 2.0? Please welcome, Spring Data!
Oliver Gierke
 

Destacado (20)

Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?
 
Building Performance - ein Frontend-Build-Prozess für Java mit Maven
Building Performance - ein Frontend-Build-Prozess für Java mit MavenBuilding Performance - ein Frontend-Build-Prozess für Java mit Maven
Building Performance - ein Frontend-Build-Prozess für Java mit Maven
 
Spring Roo 1.0.0 Technical Deep Dive
Spring Roo 1.0.0 Technical Deep DiveSpring Roo 1.0.0 Technical Deep Dive
Spring Roo 1.0.0 Technical Deep Dive
 
Generic DAOs With Hades
Generic DAOs With HadesGeneric DAOs With Hades
Generic DAOs With Hades
 
Whoops! where did my architecture go?
Whoops! where did my architecture go?Whoops! where did my architecture go?
Whoops! where did my architecture go?
 
Spring Data and MongoDB
Spring Data and MongoDBSpring Data and MongoDB
Spring Data and MongoDB
 
Coding & Music Passion And Profession
Coding & Music   Passion And ProfessionCoding & Music   Passion And Profession
Coding & Music Passion And Profession
 
REST based web applications with Spring 3
REST based web applications with Spring 3REST based web applications with Spring 3
REST based web applications with Spring 3
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?
 
Mylyn - Increasing developer productivity
Mylyn - Increasing developer productivityMylyn - Increasing developer productivity
Mylyn - Increasing developer productivity
 
Increasing developer procutivity with Mylyn (Devoxx 2010)
Increasing developer procutivity with Mylyn (Devoxx 2010)Increasing developer procutivity with Mylyn (Devoxx 2010)
Increasing developer procutivity with Mylyn (Devoxx 2010)
 
Spring Data and MongoDB
Spring Data and MongoDBSpring Data and MongoDB
Spring Data and MongoDB
 
Sophisticated JPA with Spring & Hades
Sophisticated JPA with Spring & HadesSophisticated JPA with Spring & Hades
Sophisticated JPA with Spring & Hades
 
Spring in action - Hades & Spring Roo
Spring in action - Hades & Spring RooSpring in action - Hades & Spring Roo
Spring in action - Hades & Spring Roo
 
Real world dependency injection - DPC10
Real world dependency injection - DPC10Real world dependency injection - DPC10
Real world dependency injection - DPC10
 
Mylyn
MylynMylyn
Mylyn
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in Russian
 
Data Access 2.0? Please welcome, Spring Data!
Data Access 2.0? Please welcome, Spring Data!Data Access 2.0? Please welcome, Spring Data!
Data Access 2.0? Please welcome, Spring Data!
 
CDI 2.0 is upon us Devoxx
CDI 2.0 is upon us DevoxxCDI 2.0 is upon us Devoxx
CDI 2.0 is upon us Devoxx
 
Spring integration
Spring integrationSpring integration
Spring integration
 

Similar a Data access 2.0? Please welcome: Spring Data!

San Francisco Java User Group
San Francisco Java User GroupSan Francisco Java User Group
San Francisco Java User Group
kchodorow
 
Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)
MongoSF
 
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseEclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
Heiko Behrens
 

Similar a Data access 2.0? Please welcome: Spring Data! (20)

Hands On Spring Data
Hands On Spring DataHands On Spring Data
Hands On Spring Data
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020
 
Webinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDBWebinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDB
 
Webinar: Building Your First App with MongoDB and Java
Webinar: Building Your First App with MongoDB and JavaWebinar: Building Your First App with MongoDB and Java
Webinar: Building Your First App with MongoDB and Java
 
Querydsl fin jug - june 2012
Querydsl   fin jug - june 2012Querydsl   fin jug - june 2012
Querydsl fin jug - june 2012
 
Requery overview
Requery overviewRequery overview
Requery overview
 
Building Your First MongoDB App
Building Your First MongoDB AppBuilding Your First MongoDB App
Building Your First MongoDB App
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
 
Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015
 
Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS
 
Spring data
Spring dataSpring data
Spring data
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDB
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
jQuery Datatables With MongDb
jQuery Datatables With MongDbjQuery Datatables With MongDb
jQuery Datatables With MongDb
 
San Francisco Java User Group
San Francisco Java User GroupSan Francisco Java User Group
San Francisco Java User Group
 
Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Mongo+java (1)
Mongo+java (1)Mongo+java (1)
Mongo+java (1)
 
What do you mean, Backwards Compatibility?
What do you mean, Backwards Compatibility?What do you mean, Backwards Compatibility?
What do you mean, Backwards Compatibility?
 
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseEclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
 

Último

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 

Data access 2.0? Please welcome: Spring Data!

  • 1. Data Access 2.0? …please welcome… Spring Data! Oliver Gierke
  • 4. How? Why? What?
  • 12. Hibari Voldemort Membase Riak Cassandra Redis SimpleDB (No)SQL MongoDB OrientDB CouchDB HBase Sones Neo4J
  • 17.
  • 18. Document database JSON documents JSON queries
  • 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); 19
  • 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 } 20
  • 21. Graph database Nodes / Relationships Traversals / Cypher / Gremlin
  • 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(); } 22
  • 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 } 23
  • 24. Neo4J entity class Actor { private final Node node; public Actor(Node node) { … } public String getName() { return (String) node.getProperty(„name“); } … } 24
  • 25. Forest for the woods?
  • 26. JPA?
  • 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. " 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.
  • 29. JPA?
  • 32. " … provide a familiar and consistent Spring-based programming model while retaining store-specific features and capabilities.
  • 33. Spring Data JDBC JPA
  • 34. Spring Data JDBC JPA
  • 35. Spring Data JDBC JPA
  • 36. Spring Data JDBC JPA
  • 40. 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
  • 41. 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
  • 42. 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
  • 44. 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
  • 45. 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
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. 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
  • 51. Repositories Querydsl 51
  • 52. 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
  • 54. Wrap up Sophisticated mapping support Templates Repositories Querydsl Spring namespace Geospatial support (MongoDB) Cross-store persistence
  • 56. 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