$30 off During Our Annual Pro Sale. View Details »

Persistenz unter Kontrolle mit JDBI für Java

Persistenz unter Kontrolle mit JDBI für Java

JDBI ist eine Java-Bibliothek, die typsicheren Datenbank-Zugriff und Transaktionssteuerung für SQL-Datenbanken anbietet. Es ist als Open-Source-Bibliothek verfügbar und wird seit mehreren Jahren kontinuierlich weiterentwickelt.
Im Zentrum von JDBI steht die effiziente Ausführung von SQL-Statements aus Java heraus. Hierfür bietet die Bibliothek die notwendigen Abstraktionen an, die JDBC fehlen.
Im Gegensatz zu JPA wird das SQL dabei nicht versteckt, sondern kann bewusst genutzt werden, um effizient auf die SQL-Datenbank zuzugreifen.
Im Gegensatz zu JDBC sind benannte Parameter und eine robuste Transaktionssteuerung möglich. Java-Objekte können sowohl für die Parameterübergabe als auch für die Antworten angebunden werden.
Dieser Vortrag gibt einen ersten Einstieg in die Welt von JDBI und zeigt, wie es die Aufgaben des Alltags effizient bewältigen kann.

Alexander Schwartz

November 17, 2016
Tweet

More Decks by Alexander Schwartz

Other Decks in Technology

Transcript

  1. .consulting .solutions .partnership
    Persistenz unter Kontrolle mit JDBI für Java
    DOAG Konferenz 2016 – 17. November 2016

    View Slide

  2. Persistenz unter Kontrolle mit JBDI für Java
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 2
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  3. Mein Sponsor und Arbeitgeber – msg systems ag
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 3
    1980 gegründet
    mehr als 5.500 Kollegen
    727 Millionen € Umsatz 2015
    23 Länder
    in 14 Städten
    in Deutschland präsent

    View Slide

  4. Wer ich bin – Principal IT Consultant im Geschäftsbereich Travel & Logistics
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 4
    13 Jahre Java
    7 Jahre PL/SQL
    7 Jahre
    Absatzfinanzierung
    3,5 Jahre Direktbank
    1 Frau
    2 Kinder
    496 gefundene
    Geocaches
    @ahus1de

    View Slide

  5. Persistenz unter Kontrolle mit JBDI für Java
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 5
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  6. SQL - effizienter Zugriff auf die Datenbank
    SQL – effizienter Zugriff auf die relationale Datenbank
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 6
    Effizienter Zugriff über bekannte Statements:
    INSERT ...
    UPDATE ...
    SELECT ...
    SUM (...)
    OVER (PARTITION BY ... ORDER BY ...) ... FROM ...
    ORDER BY ...

    View Slide

  7. SQL - effizienter Zugriff auf die Datenbank
    JDBC – Standard-Interface zur Datenbank für Java VM
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 7
    • Verfügbar seit Java 1.2 (1997)
    • Ist für jede relationale Datenbank verfügbar
    • Ist auch für nicht-relationale Datenbanken verfügbar (z. B. für Neo4j oder Hadoop)
    Geringes Abstraktionslevel, hohe Fehleranfälligkeit, viel redundanter Code
    Beispiele:
    • Prepared Statements mit Fragezeichen (‚?‘) die an der abgezählt richtigen Stelle stehen müssen
    • Transaktionssteuerung
    • Fehleranfällig Datenübernahme nach SQL und zurück

    View Slide

  8. SQL - effizienter Zugriff auf die Datenbank
    1. https://www.reddit.com/r/programming/comments/2cnw8x/what_orms_have_taught_me_just_learn_sql/ (2014)
    2. http://www.javaperformancetuning.com/news/interview041.shtml (2004)
    JPA als Abstraktion für JDBC
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 8
    • Verfügbar seit 2006, Teil von EJB 3.0 / Java EE 5
    • Verschiedene Implementierungen verfügbar
    • Hoher Abstraktionsgrad
    Stolpersteine:
    • Java-Objektmodell passt nur ungenau zur Persistenz der relationalen Datenbank
    • Datenbankmodell muss ggf. auf JPA angepasst werden, damit Daten effizient geladen werden können
    • 80% der täglichen Anwendungsfälle sind sehr einfach, 20% sind sehr schwer zu lösen
    • Es ist schwer, es richtig zu benutzen

    View Slide

  9. SQL - effizienter Zugriff auf die Datenbank
    1. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html
    2. http://www.jooq.org/
    3. http://www.querydsl.com/
    JDBI als Abstraktion für JDBC
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 9
    • Verfügbar seit 2.0 seit 2007, 3.0 aktuell in Arbeit
    • Minimale Abstraktion über JDBC
    • Zugriff auf SQL
    • Vermeiden von redundantem Code
    • sicherer Umgang mit Parametern
    Alternativen:
    • Spring JDBC – Unterstützung für Transaktionen, Result-Sets, Connection Handling
    • Query DSL – typsicherer Java-Code für das eigene Datenmodell
    • jOOQ – typsicherer Java-Code für das eigene Datenmodell, teilweise kostenpflichtig

    View Slide

  10. Persistenz unter Kontrolle mit JBDI für Java
    10
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  11. JDBI als Abstraction für JDBC
    Lesen von Daten – Abfrage definieren
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 11
    Konzepte:
    • Fachlich definierte Methoden als Interface (oder abstrakte Klasse)
    • SQL als Annotation
    @RegisterMapper(SightingResultMapper.class)
    public interface SightingRepsitory {
    @SqlQuery("SELECT id, name FROM sighting")
    List findAll();
    }

    View Slide

  12. JDBI als Abstraction für JDBC
    * Builder für die Klasse Sighting mit Hilfe von Lombok generiert
    Lesen von Daten – Antwortobjekte Mappen
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 12
    Konzepte:
    • Optionale Mapper für Java-Typen
    (Für triviale Java Beans kann @MapResultAsBean verwendet werden)
    public class SightingResultMapper implements ResultSetMapper {
    @Override
    public Sighting map(int index, ResultSet r,
    StatementContext ctx) throws SQLException {
    return Sighting.builder()
    .id(r.getInt("id"))
    .name(r.getString("name"))
    .build();
    }
    }

    View Slide

  13. JDBI als Abstraction für JDBC
    Lesen von Daten – Parameter übergeben
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 13
    Konzepte:
    • Benannte Parameter in SQL und Methode
    public interface SightingRepsitory ... {
    @SqlQuery("SELECT id, name FROM sighting WHERE name = :name")
    List findByName(@Bind("name") String name);
    }

    View Slide

  14. Persistenz unter Kontrolle mit JBDI für Java
    14
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  15. JDBI als Abstraction für JDBC
    Schreiben von Daten
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 15
    Konzepte:
    • Bean-Attribute sind im Zugriff
    public interface SightingRepsitory ... {
    @SqlUpdate("INSERT INTO sighting (id, name) values (:s.id, :s.name)")
    void createNewSightingWithKnownId(@BindBean("s") Sighting sighting);
    }

    View Slide

  16. JDBI als Abstraction für JDBC
    Schreiben von Daten
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 16
    Konzepte:
    • Generierte IDs werden zurückgeliefert
    public interface SightingRepsitory ... {
    @SqlUpdate("INSERT INTO sighting (id, name)
    VALUES (seq.nextval, :s.name)")
    @GetGeneratedKeys(columnName = "id",
    value = OracleGeneratedKeyMapper.class)
    int createNewSightingAutogeneratedId(@BindBean("s") Sighting sighting);
    }

    View Slide

  17. JDBI als Abstraction für JDBC
    Schreiben von Daten
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 17
    Konzepte:
    • Helfer für von Oracle generierte IDs via Sequences
    /**
    * Oracle needs to be queried by index and not id (like
    * {@link org.skife.jdbi.v2.sqlobject.FigureItOutResultSetMapper} does).
    */
    public static class OracleGeneratedKeyMapper implements ResultSetMapper {
    @Override
    public Long map(int index, ResultSet r, StatementContext ctx)
    throws SQLException {
    return r.getLong(1);
    }
    }

    View Slide

  18. Persistenz unter Kontrolle mit JBDI für Java
    18
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  19. JDBI als Abstraction für JDBC
    Transaktionen
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 19
    Konzepte:
    • Annotationen in abstrakten Klassen
    public abstract class SightingRepsitory ... {
    @Transaction
    public Set doMultipleThings(Sighting s1, Sighting s2) {
    Set result = new HashSet<>();
    result.add(createNewSightingAutogeneratedId(s1));
    result.add(createNewSightingAutogeneratedId(s2));
    return result;
    }
    }

    View Slide

  20. JDBI als Abstraction für JDBC
    Transaktionen
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 20
    Konzepte:
    • Explizite Steuerung über funktionale Wrapper
    public abstract class SightingRepsitory implements Transactional<...> {
    public Set doMultipleThingsAnotherWay(Sighting s1, Sighting s2) {
    return inTransaction((t, status) -> {
    Set result = new HashSet<>();
    result.add(t.createNewSightingAutogeneratedId(s1));
    result.add(t.createNewSightingAutogeneratedId(s2));
    return innerResult;
    });
    }
    }

    View Slide

  21. JDBI als Abstraction für JDBC
    Transaktionen
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 21
    Konzepte:
    • Kombinierter Aufruf von bestehenden Repositories (Composition)
    public abstract class Wrapper implements GetHandle {
    public Set doMultipleThings(Sighting s1, Sighting s2) {
    return getHandle().inTransaction((conn, status) -> {
    Set result = new HashSet<>();
    SightingRepsitory repo = conn.attach(SightingRepsitory.class);
    result.add(repo.createNewSightingAutogeneratedId(s1));
    result.add(repo.createNewSightingAutogeneratedId(s2));
    return result;
    });
    }
    }

    View Slide

  22. Persistenz unter Kontrolle mit JBDI für Java
    22
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  23. JDBI als Abstraction für JDBC
    Batching
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 23
    Konzept:
    • Übergabe der Objekte als Array oder Iterator beim Schreiben
    public interface SightingRepsitory {
    @SqlBatch("INSERT INTO sighting (id, name) VALUES (seq.nextval, :name)")
    @BatchChunkSize(1000)
    // we could pass an Iterator to deliver Sightings just in time
    void createNewSightings(@BindBean List sighting);
    }

    View Slide

  24. JDBI als Abstraction für JDBC
    Batching
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 24
    Konzept:
    • Begrenzen der Anzahl der zurückgelieferten Zeilen
    • Iterator, der die Objekte just-in-time erzeugt, wenn sie benötigt werden
    public interface SightingRepsitory {
    @SqlQuery("SELECT id, name FROM sighting")
    @MaxRows(100)
    @MapResultAsBean
    Iterator selectSomeSightings();
    }

    View Slide

  25. Persistenz unter Kontrolle mit JBDI für Java
    25
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  26. JDBI als Abstraction für JDBC
    Stored Procedures
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 26
    Konzept:
    • Out-Parameter benennen
    public interface Calculator {
    @SqlCall("{ CALL calculate_score(:distance, :weight, :score) }")
    @OutParameter(name = "score", sqlType = Types.INTEGER)
    OutParameters calculateScore(@Bind("distance") long distance,
    @Bind("weight") long weight);
    }
    }
    /* ... */
    long score = calculator.calculateScore(4, 2).getLong("score");

    View Slide

  27. Persistenz unter Kontrolle mit JBDI für Java
    27
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016
    SQL - effizienter Zugriff auf die Datenbank
    1
    JDBI als Abstraction für JDBC
    2
    • Lesen von Daten
    • Schreiben von Daten
    • Transaktionen
    • Batching
    • Stored Procedures
    Recap - JDBI als minimale Abstraction
    3

    View Slide

  28. Recap
    JDBI als minimale Abstraktion
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 34
    Funktionsbereich Unterstützung durch JDBI
    Lesen von Daten
    Schreiben von Daten
    Transaktionen
    Batching
    Stored Procedures
    Dokumentation
    @ahus1de
    Fazit:
    • Leichtgewichtiges Framework für diejenigen, die SQL beherrschen und nutzen wollen
    • Gute Unterstützung für namensbasierte Parametrisierung von SQL Statements

    View Slide

  29. Links
    © msg | Persistenz unter Kontrolle mit JDBI für Java | Alexander Schwartz | DOAG Konferenz 2016 35
    JDBI
    http://jdbi.org/
    https://github.com/jdbi/jdbi
    http://groups.google.com/group/jdbi
    @ahus1de
    Beispielprojekt
    https://github.com/ahus1/jdbi-by-example

    View Slide

  30. .consulting .solutions .partnership
    Alexander Schwartz
    Principal IT Consultant
    +49 171 5625767
    [email protected]
    @ahus1de
    msg systems ag (Headquarters)
    Robert-Buerkle-Str. 1, 85737 Ismaning
    Germany
    www.msg-systems.com

    View Slide