Hands On Spring Data

1,873 views
1,687 views

Published on

Slides to the Hands On Spring Data lab, presented in Paris on Dec 10th, 2012. Code exercises are here: https://github.com/ericbottard/hands-on-spring-data

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,873
On SlideShare
0
From Embeds
0
Number of Embeds
58
Actions
Shares
0
Downloads
38
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Hands On Spring Data

  1. 1. Hands On Spring DataEric Bottard, Developer Advocate, VMware@ebottardFlorent Biville, Developer, Lateral Thoughts@fbiville© 2012 SpringSource, by VMware
  2. 2. Eric BOTTARD• Developer Advocate VMware• @ebottard• ebottard@vmware.com2
  3. 3. Florent BIVILLE• Développeur chez LateralThoughts• @fbiville3
  4. 4. “ Spring Data is an umbrella project which aims to provide a familiar and consistent Spring-based programming model for for new datastores while retaining store- specific features and capabilities
  5. 5. RelationalJDBCJPA
  6. 6. Document storeMongoDBCouchDB
  7. 7. Column orientedHBaseCassandra
  8. 8. GraphNeo4jOrientDB
  9. 9. Data GridsGemFireCoherenceTerracotta
  10. 10. Key ValueRedisRiak
  11. 11. Big DataHadoop
  12. 12. Templates
  13. 13. Mapping
  14. 14. Mapping• Tells the framework how to store object properties and relationships• Favors convention over configuration• Does not try to shoehorn one model into another (e.g. does not use JPA annotations for Mongo)14
  15. 15. Example: MongoDB@Document@CompoundIndexes({ @CompoundIndex(name = "age_idx", def = "{lastName: 1, age: -1}")})public class Person<T extends Address> { @Id private String id; @Indexed(unique = true) private Integer ssn; @Field("fName") private String firstName; @Indexed private String lastName; @Transient private Integer accountTotal; @DBRef private List<Account> accounts; private T address;
  16. 16. Repositories
  17. 17. Repositoriespublic interface PersonRepository extends CrudRepository<User, Long> { …}No implementation needed!
  18. 18. Magic Finders
  19. 19. Magic Finderspublic interface PersonRepository extends Repository<User, Long> { List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, Stringlastname); // Enables the distinct flag for the query List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, Stringfirstname); List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, Stringfirstname); // Enabling ignoring case for an individual property List<Person> findByLastnameIgnoreCase(String lastname); // Enabling ignoring case for all suitable properties List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, Stringfirstname); // Enabling static ORDER BY for a query List<Person> findByLastnameOrderByFirstnameAsc(String lastname); List<Person> findByLastnameOrderByFirstnameDesc(String lastname);}
  20. 20. Pagination
  21. 21. Pagination and Dynamic Orderingpublic interface PersonRepository extends CrudRepository<User, Long> { Page<User> findByLastname(String lastname, Pageable pageable); List<User> findByLastname(String lastname, Sort sort); // NOTE: Pageable embeds a Sort}
  22. 22. Qu eries
  23. 23. Explicit Queriespublic interface ProductsRepository extends JpaRepository<Product, Long> { @Query(value = "select p from Product p order by p.rating desc", countQuery = "select count(p) from Product p") Page<Product> findTopRated(Pageable pageable);}
  24. 24. Cross Store support
  25. 25. Query DSL Integration
  26. 26. REST
  27. 27. REST Shell
  28. 28. Customization
  29. 29. JSON
  30. 30. Mongo DB - schema-less document DBdatabasesmongo> show dbs; myDatabase 0.3046578 GBmongo> use myDatabase; collections mongo> show collections; rockCollection colleagueSean mongo> db.rockCollection.find().pretty(); // last call “prettifies” output documents mongo> db.rockCollection.find({name:"The Beatles"}).pretty(); {"_id" : ObjectId("50b7d870744e5ef5eee5224e"), "_class" : "xxx.music.domain.Band", "name" : "The Beatles", [...] }
  31. 31. MongoDB: Queries as JSON documentsdb.inventory.find({ price:1.99, $or: [ { qty: { $lt: 20 } }, { sale: true } ]})
  32. 32. GridFS - can I haz large objectz?• mongo> show collections; – fs.chunks – fs.files• CHUNKS – 256KB portion of a Mongo object (a.k.a. file), stored into collection “fs.chunks”• FILES – Metadata about the file stored into “fs.files”: filename, content type ...• Spring Data brings – GridFsTemplate – GridFsResource (wraps GridFSDBFile)33
  33. 33. Nodes & Relationships35
  34. 34. Nodes NoSQL Spring HELPS_WITH standsFor: "Not Only Data how: "it roxx" SQL"IS_PART_OF Properties Relationship Spring
  35. 35. Cypher
  36. 36. Neo4J - Cypher Query Languagestart doctor=node:characters(character = Doctor)match (doctor)<-[:COMPANION_OF]-(companion) -[:APPEARED_IN]->(episode)return companion.character, count(episode)order by count(episode) desclimit 5
  37. 37. Image credits• keys http://www.sxc.hu/photo/1381979• spiderweb http://www.sxc.hu/photo/1309629• columns http://www.sxc.hu/photo/511217• documents http://www.sxc.hu/photo/913588• umbrella http://www.sxc.hu/photo/1182110• nail http://www.sxc.hu/photo/1101239• relational http://www.sxc.hu/photo/541351• callback http://www.sxc.hu/photo/1134440• repositories http://www.sxc.hu/photo/1352633• pagination http://www.sxc.hu/photo/830250• magic http://www.sxc.hu/photo/829135• cypher http://www.sxc.hu/photo/1118342• mapping http://www.sxc.hu/photo/1147986• grid http://www.sxc.hu/photo/1222068• elephant http://www.sxc.hu/photo/1168187• cross knot http://www.sxc.hu/photo/1396427• rope knot http://www.sxc.hu/photo/1181983• married http://www.sxc.hu/photo/937988• shell http://www.sxc.hu/photo/866402• diesel http://www.sxc.hu/photo/1076436• car tuning http://www.sxc.hu/photo/5877• rest on couch: If you haven’t, go watch Fight Club. NOW.39

×