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.

5f528a3f6814d28b583f31842e3e8d9e?s=128

Alexander Schwartz

November 17, 2016
Tweet

Transcript

  1. .consulting .solutions .partnership Persistenz unter Kontrolle mit JDBI für Java

    DOAG Konferenz 2016 – 17. November 2016
  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
  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
  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
  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
  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 ...
  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
  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
  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
  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
  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<Sighting> findAll(); }
  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<Sighting> { @Override public Sighting map(int index, ResultSet r, StatementContext ctx) throws SQLException { return Sighting.builder() .id(r.getInt("id")) .name(r.getString("name")) .build(); } }
  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<Sighting> findByName(@Bind("name") String name); }
  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
  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); }
  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); }
  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<Long> { @Override public Long map(int index, ResultSet r, StatementContext ctx) throws SQLException { return r.getLong(1); } }
  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
  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<Integer> doMultipleThings(Sighting s1, Sighting s2) { Set<Integer> result = new HashSet<>(); result.add(createNewSightingAutogeneratedId(s1)); result.add(createNewSightingAutogeneratedId(s2)); return result; } }
  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<Integer> doMultipleThingsAnotherWay(Sighting s1, Sighting s2) { return inTransaction((t, status) -> { Set<Integer> result = new HashSet<>(); result.add(t.createNewSightingAutogeneratedId(s1)); result.add(t.createNewSightingAutogeneratedId(s2)); return innerResult; }); } }
  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<Integer> doMultipleThings(Sighting s1, Sighting s2) { return getHandle().inTransaction((conn, status) -> { Set<Integer> result = new HashSet<>(); SightingRepsitory repo = conn.attach(SightingRepsitory.class); result.add(repo.createNewSightingAutogeneratedId(s1)); result.add(repo.createNewSightingAutogeneratedId(s2)); return result; }); } }
  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
  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> sighting); }
  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<Sighting> selectSomeSightings(); }
  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
  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");
  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
  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
  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
  30. .consulting .solutions .partnership Alexander Schwartz Principal IT Consultant +49 171

    5625767 alexander.schwartz@msg-systems.com @ahus1de msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg-systems.com