MongoDB Munich 2012:
Einführung in Spring Data MongoDB
tobias.trelle@codecentric.de / @tobiastrelle
codecentric AG
Agenda

      Spring Framework

      Spring Data

      Spring Data MongoDB

                 MongoDB-Template
                 Object Mapping
                 Repository Support
                 Beispiele




codecentric AG
Spring Framework


What is Spring?
 Spring is the most popular application development
 framework for enterprise Java™. Millions of
 developers use Spring to create high
 performing, easily testable, reusable code without
 any lock-in.



Quelle: http://www.springsource.org
codecentric AG
Spring Framework

       Leichgewichtes Framework für Java Enterprise Anwendungen

       Kern: IoC-Container für Depedency Injection

       Läuft ohne JEE-Server

       Unterstützt viele Technologie-Stacks




codecentric AG
Spring Framework

Projekte

•     Spring AMQP                  •   Spring Mobile
•     Spring for Android           •   Spring .NET
•     Spring Batch                 •   Spring Roo
•     Spring Data                  •   Spring Security
•     Spring Framework             •   Spring Social
•     Spring Gemfire               •   Spring Web Flow
•     Spring Integration           •   Spring Web Services




Github: https://github.com/SpringSource
codecentric AG
Spring Data
Einheitliches Programmiermodell für RDBMS und NoSQL-Datastores

                                            Spring Data
                                  CrudRepository     PagingAndSortingRepository

                  Spring Data      Spring Data          Spring Data           Spring Data
                      JPA           MongoDB               Neo4j                    …
                 JpaRepository   MongoRepository      GraphRepository
                                 MongoTemplate         Neo4jTemplate


                                                      Embedded     REST


                      JPA        Mongo Java Driver

                     JDBC



                    RDBMS             MongoDB              Neo4j                   …



Quelle: http://www.infoq.com/articles/spring-data-intro
codecentric AG
Spring Data Allgemein

Template
                 Konfiguration von Ressourcen
                 Einheitliches Exception-Handling


Object Mapping
                 Annotationsbasiertes Mapping von Java-Objekten auf DB-Strukturen
                 (Tabellen, Collections, Nodes)
                 Convention over Configuration, viele sinnvolle Default Mappings


Repository Support
                 DAOs werden als Interfaces implementiert
                 Query-Implementierungen werden über Namenskonventionen abgeleitet
                 CRUD-Operation und Paging/Sortieren out-of-the-box




codecentric AG
Spring Data MongoDB

Template
                 Abstraktion vom MongoDB Java Driver
                 Konfiguration von mongod / mongos-Instanzen und Collections
                 Verwaltung von Collections
                 Map/Reduce-Aufrufe


Object Mapping
                 Annotationen @Document, @Field, @Index etc.
                 Klassen werden auf Collections abgebildet, Java-Objekte auf Dokumente


Repository Support
                 Schlüsselwörter werden auf Query-Operator abgebildet
                 Geospatial Queries




codecentric AG
MongoDB Template
Konfiguration

     <!-- Connection to MongoDB server -->
     <mongo:db-factory host="localhost" port="27017" dbname="test" />


     <!-- MongoDB Template -->
     <bean id="mongoTemplate"
          class="org.springframework.data.mongodb.core.MongoTemplate">
          <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
     </bean>

Verwendung

     @Autowired MongoTemplate template;

     template.indexOps(Location.class).ensureIndex(
          new GeospatialIndex("position") );

codecentric AG
MongoDB Template
Ausführliche Konfiguration der Mongo Connection:
<mongo:mongo host="${mongo.host}" port="${mongo.port}">
  <mongo:options
        connections-per-host="${mongo.connectionsPerHost}„
        threads-allowed-to-block-for-connection
        multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}„
        connect-timeout="${mongo.connectTimeout}„
        max-wait-time="${mongo.maxWaitTime}„
        auto-connect-retry="${mongo.autoConnectRetry}„
        socket-keep-alive="${mongo.socketKeepAlive}„
        socket-timeout="${mongo.socketTimeout}„
        slave-ok="${mongo.slaveOk}„
        write-number="1„
        write-timeout="0„
        write-fsync="true"/>
</mongo:mongo>
<mongo:db-factory dbname= "test" mongo-ref="mongo"/>


codecentric AG
MongoDB Template
Konfiguration für Replica Set:


<mongo:mongo
     id="replicaSetMongo"
     replica-set="127.0.0.1:27017,localhost:27018"
/>




codecentric AG
MongoDB Object Mapping
Code Beispiel: Persistenze Domainklasse „User“:


@Document(collection = "usr")
public class User {

     @Id private String id;


     @Indexed private String fullName;


     private Date lastLogin;
    ...
}




codecentric AG
MongoDB Repository Support

       Grundidee:

      für Definition von Queries reicht die Signatur einer Methode, die Implementierung
      wird zur Laufzeit daraus abgeleitet

       Basis-Implementierungen vorhanden für

                 CRUD-Operationen

                 Blättern


                 Sortieren




codecentric AG
MongoDB Repository Support
Konfiguration


     <!-- Package w/ automagic repositories -->
     <mongo:repositories base-package="mongodb" />



Implementierung


     public interface UserRepository extends MongoRepository<User, String> {

                 List<User> findByFullNameLike(String fullName, Sort sort);

                 @Query("{ fullName: ?0 }")
                 List<User> findByTheUsersFullName(String fullName);
     }


codecentric AG
MongoDB Repository Support
Verwendung


@Autowired UserRepository repo;
...


List<User> users;


// custom finder
users = repo.findByFullNameLike("^User", null);


// paging & general finder
Page<User> page = repo.findAll( new PageRequest(2, 2 ) );
users = page.getContent();



codecentric AG
Alles auf einen Blick




codecentric AG
Live Demo




codecentric AG
Was gibt‘s sonst noch?

      Viele Konfigurationsmöglichkeiten

      @CompoundIndex – zusammengesetzte Indexe auf Klassenebene

      @Version – optimistisches Locking auf Anwendungsebene (neu in 1.1.0)

      Template für GridFS-Unterstützung (neu in 1.1.0)

      Geodaten-Unterstützung

      Map/Reduce



codecentric AG
MongoDB User-Gruppen in Düsseldorf / Frankfurt



                  MongoDB User-Gruppe Düsseldorf
                 https://www.xing.com/net/mongodb-dus
                               @MongoDUS
                         Contact: Tobias Trelle




                 MongoDB User-Gruppe Frankfurt/Main
                  https://www.xing.com/net/mongodb-ffm
                                @MongoFFM
                          Contact: Uwe Seiler

codecentric AG
Quellennachweise

      Spring Zitat: http://www.springsource.org


      Spring Logo: https://twitter.com/springsource


      Source Code Beispiele: https://github.com/ttrelle/spring-data-examples/




codecentric AG
QUESTION?

Tobias Trelle

codecentric AG
Merscheider Str. 1
42699 Solingen

tel              +49 (0) 212.233628.47
fax              +49 (0) 212.233628.79
mail             Tobias.Trelle@codecentric.de
twitter          @tobiastrelle

www.codecentric.de
blog.codecentric.de/author/tobias-trelle
www.xing.com/net/mongodb-dus



codecentric AG                                  08.10.2012   21

MongoDB Munich 2012: Spring Data MongoDB

  • 1.
    MongoDB Munich 2012: Einführungin Spring Data MongoDB tobias.trelle@codecentric.de / @tobiastrelle codecentric AG
  • 2.
    Agenda Spring Framework Spring Data Spring Data MongoDB MongoDB-Template Object Mapping Repository Support Beispiele codecentric AG
  • 3.
    Spring Framework What isSpring? Spring is the most popular application development framework for enterprise Java™. Millions of developers use Spring to create high performing, easily testable, reusable code without any lock-in. Quelle: http://www.springsource.org codecentric AG
  • 4.
    Spring Framework Leichgewichtes Framework für Java Enterprise Anwendungen Kern: IoC-Container für Depedency Injection Läuft ohne JEE-Server Unterstützt viele Technologie-Stacks codecentric AG
  • 5.
    Spring Framework Projekte • Spring AMQP • Spring Mobile • Spring for Android • Spring .NET • Spring Batch • Spring Roo • Spring Data • Spring Security • Spring Framework • Spring Social • Spring Gemfire • Spring Web Flow • Spring Integration • Spring Web Services Github: https://github.com/SpringSource codecentric AG
  • 6.
    Spring Data Einheitliches Programmiermodellfür RDBMS und NoSQL-Datastores Spring Data CrudRepository PagingAndSortingRepository Spring Data Spring Data Spring Data Spring Data JPA MongoDB Neo4j … JpaRepository MongoRepository GraphRepository MongoTemplate Neo4jTemplate Embedded REST JPA Mongo Java Driver JDBC RDBMS MongoDB Neo4j … Quelle: http://www.infoq.com/articles/spring-data-intro codecentric AG
  • 7.
    Spring Data Allgemein Template Konfiguration von Ressourcen Einheitliches Exception-Handling Object Mapping Annotationsbasiertes Mapping von Java-Objekten auf DB-Strukturen (Tabellen, Collections, Nodes) Convention over Configuration, viele sinnvolle Default Mappings Repository Support DAOs werden als Interfaces implementiert Query-Implementierungen werden über Namenskonventionen abgeleitet CRUD-Operation und Paging/Sortieren out-of-the-box codecentric AG
  • 8.
    Spring Data MongoDB Template Abstraktion vom MongoDB Java Driver Konfiguration von mongod / mongos-Instanzen und Collections Verwaltung von Collections Map/Reduce-Aufrufe Object Mapping Annotationen @Document, @Field, @Index etc. Klassen werden auf Collections abgebildet, Java-Objekte auf Dokumente Repository Support Schlüsselwörter werden auf Query-Operator abgebildet Geospatial Queries codecentric AG
  • 9.
    MongoDB Template Konfiguration <!-- Connection to MongoDB server --> <mongo:db-factory host="localhost" port="27017" dbname="test" /> <!-- MongoDB Template --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> </bean> Verwendung @Autowired MongoTemplate template; template.indexOps(Location.class).ensureIndex( new GeospatialIndex("position") ); codecentric AG
  • 10.
    MongoDB Template Ausführliche Konfigurationder Mongo Connection: <mongo:mongo host="${mongo.host}" port="${mongo.port}"> <mongo:options connections-per-host="${mongo.connectionsPerHost}„ threads-allowed-to-block-for-connection multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}„ connect-timeout="${mongo.connectTimeout}„ max-wait-time="${mongo.maxWaitTime}„ auto-connect-retry="${mongo.autoConnectRetry}„ socket-keep-alive="${mongo.socketKeepAlive}„ socket-timeout="${mongo.socketTimeout}„ slave-ok="${mongo.slaveOk}„ write-number="1„ write-timeout="0„ write-fsync="true"/> </mongo:mongo> <mongo:db-factory dbname= "test" mongo-ref="mongo"/> codecentric AG
  • 11.
    MongoDB Template Konfiguration fürReplica Set: <mongo:mongo id="replicaSetMongo" replica-set="127.0.0.1:27017,localhost:27018" /> codecentric AG
  • 12.
    MongoDB Object Mapping CodeBeispiel: Persistenze Domainklasse „User“: @Document(collection = "usr") public class User { @Id private String id; @Indexed private String fullName; private Date lastLogin; ... } codecentric AG
  • 13.
    MongoDB Repository Support Grundidee: für Definition von Queries reicht die Signatur einer Methode, die Implementierung wird zur Laufzeit daraus abgeleitet Basis-Implementierungen vorhanden für CRUD-Operationen Blättern Sortieren codecentric AG
  • 14.
    MongoDB Repository Support Konfiguration <!-- Package w/ automagic repositories --> <mongo:repositories base-package="mongodb" /> Implementierung public interface UserRepository extends MongoRepository<User, String> { List<User> findByFullNameLike(String fullName, Sort sort); @Query("{ fullName: ?0 }") List<User> findByTheUsersFullName(String fullName); } codecentric AG
  • 15.
    MongoDB Repository Support Verwendung @AutowiredUserRepository repo; ... List<User> users; // custom finder users = repo.findByFullNameLike("^User", null); // paging & general finder Page<User> page = repo.findAll( new PageRequest(2, 2 ) ); users = page.getContent(); codecentric AG
  • 16.
    Alles auf einenBlick codecentric AG
  • 17.
  • 18.
    Was gibt‘s sonstnoch? Viele Konfigurationsmöglichkeiten @CompoundIndex – zusammengesetzte Indexe auf Klassenebene @Version – optimistisches Locking auf Anwendungsebene (neu in 1.1.0) Template für GridFS-Unterstützung (neu in 1.1.0) Geodaten-Unterstützung Map/Reduce codecentric AG
  • 19.
    MongoDB User-Gruppen inDüsseldorf / Frankfurt MongoDB User-Gruppe Düsseldorf https://www.xing.com/net/mongodb-dus @MongoDUS Contact: Tobias Trelle MongoDB User-Gruppe Frankfurt/Main https://www.xing.com/net/mongodb-ffm @MongoFFM Contact: Uwe Seiler codecentric AG
  • 20.
    Quellennachweise Spring Zitat: http://www.springsource.org Spring Logo: https://twitter.com/springsource Source Code Beispiele: https://github.com/ttrelle/spring-data-examples/ codecentric AG
  • 21.
    QUESTION? Tobias Trelle codecentric AG MerscheiderStr. 1 42699 Solingen tel +49 (0) 212.233628.47 fax +49 (0) 212.233628.79 mail Tobias.Trelle@codecentric.de twitter @tobiastrelle www.codecentric.de blog.codecentric.de/author/tobias-trelle www.xing.com/net/mongodb-dus codecentric AG 08.10.2012 21