http://www.tutego.com/ JdbcTemplate



Ähnliche Dokumente
Schieberegler und analoge Anzeigen

Java: Vererbung. Teil 3: super()

Oracle: Abstrakte Datentypen:

Einführung in die Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Client-Server-Beziehungen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Prinzipien Objektorientierter Programmierung

Einführung in die Java- Programmierung

Große Übung Praktische Informatik 1

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Der lokale und verteilte Fall

Programmieren in Java

Objektorientierte Programmierung

Programmierkurs Java

SEP 114. Design by Contract

Schedulingund Thread-Ausführer

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Software Engineering Klassendiagramme Assoziationen

Objektorientierte Programmierung

Typumwandlungen bei Referenztypen

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Datenmanagement in Android-Apps. 16. Mai 2013

Javakurs zu Informatik I. Henning Heitkötter

Java Kurs für Anfänger Einheit 5 Methoden

Grundlagen von Python

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Innere Klassen in Java

Das Leitbild vom Verein WIR

Software Engineering Klassendiagramme Einführung

Professionelle Seminare im Bereich MS-Office

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Beispiel: DB-Mock (1/7)

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Prozedurale Datenbank- Anwendungsprogrammierung

Klausur zur Einführung in die objektorientierte Programmierung mit Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Was meinen die Leute eigentlich mit: Grexit?

Erfahrungen mit Hartz IV- Empfängern

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Nathan Burgener. Design by Contract. Modul SWE

Zählen von Objekten einer bestimmten Klasse

Vorkurs C++ Programmierung

Software Engineering Interaktionsdiagramme

Bauteilattribute als Sachdaten anzeigen

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Statuten in leichter Sprache

Factory Method (Virtual Constructor)

Testen mit JUnit. Motivation

3 Objektorientierte Konzepte in Java

Ein Ausflug zu ACCESS

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

Objektorientierte Programmierung für Anfänger am Beispiel PHP

3. Stored Procedures und PL/SQL

Anleitung über den Umgang mit Schildern

desk.modul : WaWi- Export

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Dokumentenverwaltung im Internet

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Unsere Webapplikation erweitern

Themen. Web Service - Clients. Kommunikation zw. Web Services

Wir machen neue Politik für Baden-Württemberg

Einführung in die Java- Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5

Leichte-Sprache-Bilder

OSF Integrator für Btracking und Salesforce Anleitung für die Nutzer

Kapitel 6. Vererbung

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

Studentische Lösung zum Übungsblatt Nr. 7

Java Einführung Collections

Assoziation und Aggregation

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

LISP. Eine Einführung

Hilfedatei der Oden$-Börse Stand Juni 2014

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

WebService in Java SE und EE

1. EINLEITUNG 2. GLOBALE GRUPPEN Globale Gruppen anlegen

Einstellen der Makrosicherheit in Microsoft Word

Übungen Programmieren 1 Felix Rohrer. Übungen

Studieren- Erklärungen und Tipps

Viele Bilder auf der FA-Homepage

Remote Method Invocation

trivum Multiroom System Konfigurations- Anleitung Erstellen eines RS232 Protokolls am Bespiel eines Marantz SR7005

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Programmieren in Java

Transkript:

http://www.tutego.com/ JdbcTemplate

JdbcTemplate Die Klasse org.springframework.jdbc.core.jdbctemplateist zentral im JDBC-Paket von Spring. Die Klasse führt einfach SQL-Anweisungen aus liest Ergebnisse ein und transformiert sie in Objekte ummantelt SQLException in DataAccessException. Ein Beispiel, wie man die Klasse prima für Tests nutzen kann: JdbcTemplate jt = new JdbcTemplate(ds); jt.execute("delete from mytable"); jt.execute("insert into mytable (id, name) values(1, 'John )"); jt.execute("insert into mytable (id, name) values(2, 'Jane )"); 2

Wie das JdbcTemplatenutzen? Für einen JDBC-DAO gibt es zwei Möglichkeiten, wie man mit dem JdbcTemplate weitermacht: Die DAO-Implementierunglässt sich etwa im Konstruktor die DataSourceübergeben und baut dann selbst das JdbcTemplate auf. Den Verweise auf das JdbcTemplate merkt man sich in einer Objekt-Variablen und bietet den anderen Methoden Zugriff darauf. Die eigene DAO-Klasseerbt von JdbcTemplate. Man injiziert auch wieder DataSource, nur nimmt das schon setdatasource(). Vorteil der Vererbungs-Lösung: Etwas kürzer. Ein Nachteil: Mit der Einfachvererbung unter Umständen eine Einschränkung. 3

JdbcTemplateals Basisklasse Mit dem JdbcTemplateals Basisklasse lässt sich der CustomerDaoJdbcImpl aufbauen. Er empfängt die DataSource. Die Applikation wiederum bekommt diesen CustomerDaoJdbcImplals einen CustomerDao geliefert. 4

JdbcTemplate: execute() und update() JdbcTemplate ist eine zustandslose und Thread-sichere Klasse, mit der im Allgemeinen jeder DAO verbunden ist. Zum Schicken einer SQL-Anweisung dient: void execute(string sql) Die Anweisung ist oft eine DDL, etwa CREATE TABLE. Für SQL UPDATE-Anweisungen dienen die Methoden int update(stringsql) int update(stringsql, Object[] args) int update(string sql, Object[] args, int[] argtypes) Die Rückgabe ist (wie üblich) die Anzahl modifizierter Sätze. 5

JdbcTemplate: queryforxxx() 1 Zum Anfragen definiert JdbcTemplate int queryforint(stringsql) long queryforlong(stringsql) Object queryforobject(string sql, Class requiredtype) Eine TypeMismatchDataAccessExceptionzeigt ein Konvertierungsfehler an. JdbcTemplate jt = new JdbcTemplate( ds ); int nr = jt.queryforint("select COUNT(*) FROM Customer"); 6

JdbcTemplate: queryforxxx() 2 Die Methode List queryforlist(stringsql) liefert eine Liste mit Map-Exemplare. Der Schlüssel der Map ist der Spaltenname. 7

Platzhalter definieren Die genannten Methoden führen ein SQL-Statement aus, aber kein PreparedStatement. Das ist aber wichtig, wenn veränderbare Parameter eingesetzt werden. Die query()-und auch die update()-methodensind daher überladen, um ein Objektfeld anzunehmen, was die Parameter definiert. JdbcTemplate jt = new JdbcTemplate( ds ); Object[] param = { "Chris" }; int count = jt.queryforint( "SELECT COUNT(*) FROM Customer WHERE firstname LIKE?", param ); 8

RowMapper Die Rückgabe als Feld ist aus objektorientierter Sicht selten befriedigend. Man möchte oft ein die Spalten auf ein Objekt mappen. Das Mappingvon einem java.sql.resultsetauf ein Objekt definiert eine org.springframework.jdbc.core.rowmapper. Die Schnittstelle RowMapper schreibt eine Methode vor: Object maprow(resultset rs, int rownum) Die Rückgabe kann durch einen konvariantenrückgabetyp in Java 5 natürlich auch etwas konkretes sein. 9

CustomerRowMapper class CustomerRowMapper implements RowMapper { public Customer maprow( ResultSet rs, int rownum ) throws SQLException { Customer c = new Customer(); c.setid( rs.getint( "Id" ) ); c.setname( rs.getstring( "Name" ) ); return c; } } 10

getcustomers() aus dem DAO Aus der Schnittstelle CustomerDaoimplementieren wir getcustomers() wie folgt: @SuppressWarnings("unchecked") public Collection<Customer> getcustomers() { return query( "SELECT Id, Name FROM Customers", new CustomerRowMapper() ); } Das @SuppressWarnings("unchecked") ist nötig, da query() nur eine untypisierte Collection liefert. 11

findcustomerbyid() aus dem DAO public Customer findcustomerbyid( int id ) { String sql = "SELECT Id, Name FROM Customers WHERE Id=?"; try { return (Customer) queryforobject( sql, new Object[] { id }, new CustomerRowMapper() ); } catch ( IncorrectResultSizeDataAccessException e ) { } } return null; 12

save() aus dem DAO public void save( Customer customer ) { if ( findcustomerbyid( customer.getid() ) == null ) { Object[] args = { customer.getid(), customer.getname() }; update("insert INTO Customers (Id, Name) VALUES (?,?)", args); } else { Object[] args = { customer.getname(), customer.getid() }; update("update Customers SET Name =? WHERE Id =?", args); } } 13

DataAccessExceptionund Kinder Die Klasse DataAccessException ist die Oberklasse für diverse Datenbank-Fehler. Relevant sind: DataAccessResourceFailureException. Kein Connect zur DB BadSqlGrammarException DataIntegrityViolationException. Etwa bei gleichen PK DataRetrievalFailureException CannotAcquireLockException 14

http://www.tutego.com/ SimpleJdbcTemplate

SimpleJdbcTemplate Das org.springframework.jdbc.core.jdbctemplate compiliert unter Java 1.4 und nutzt keine Eigenschaften von Java 5 wie Generics, Autoboxing und Varags. org.springframework.jdbc.core.simple.simplejdbctemplate ist eine neue Klasse seit Spring 2.0 mit einer überschaubaren Anzahl Methoden für Java 5. Es ist eine Java 5-Fassade vor dem JdbcTemplate. Der Konstruktor von SimpleJdbcTemplatenimmt wie JdbcTemplate eine DataSource an. SimpleJdbcTemplateist eine Implementierung von SimpleJdbcOperations. 16

Methoden vom SimpleJdbcTemplate int queryforint(string sql, Object... args) long queryforlong(string sql, Object... args) Erfragt ein int/long über einen SQL-String und optionalen Argumenten. List<Map<String,Object>> queryforlist(string sql, Object... args) Map<String,Object> queryformap(string sql, Object... args) Führt die SQL-Anfrage mit optionalen Argumenten aus. <T> T queryforobject(string sql, ParameterizedRowMapper<T> rm, Object... args) Die SQL-Anfrage liefert ein Ergebnis, das der Mapper auf ein Objekt überträgt. <T>T queryforobject( String sql, Class<T> requiredtype, Object... args) Führt eine SQL-Anfrage aus und überträgt die Eigenschaften auf ein Objekt. <T> List<T> query(string sql, ParameterizedRowMapper<T> rm, Object... args) Der ParameterizedRowMapper überträgt Ergebnisse auf Objekte. int update(string sql, Object... args) Führt ein SQL-Update mit optionalen Argumenten durch. 17

SimpleJdbcTemplateund JdbcTemplate Neben dem Konstruktor SimpleJdbcTemplate(DataSource) gibt es einen zweiten: SimpleJdbcTemplate( JdbcOperations classicjdbctemplate) Als Übergabe ist ein Objekt vom Typ JdbcOperationsnötig; JdbcTemplate implementiert diese Schnittstelle. Das SimpleJdbcTemplatehat 7 queryxxx()-funktionenund eine update()-funktionund bietet damit das, was man in der Praxis am häufigsten benötigt. Vom SimpleJdbcTemplatekann man auf die größere Schnittstelle JdbcOperations kommen. Damit kann man etwa Batch-Updatesausführen. JdbcOperations getjdbcoperations() liefert das Objekt. 18

SimpleJdbcDaoSupport Die DAO-Klassenvon Spring erlauben Zugriff auf die Template-Objekte. Während JdbcDaoSupportein JdbcTemplateliefert, gibt SimpleJdbcDaoSupport ein SimpleJdbcTemplate. SimpleJdbcDaoSupportist eine Unterklasse von JdbcDaoSupport. org.springframework.jdbc.core.support.jdbcdaosupport org.springframework.jdbc.core.simple.simplejdbcdaosupport SimpleJdbcDaoSupport fügt eine öffentliche Methode hinzu: SimpleJdbcTemplate getsimplejdbctemplate() 19

http://www.tutego.com/ Transaktionen

DummyDao public class DummyDao extends JdbcTemplate { public void initdatabase() { execute( "CREATE TABLE Customers( Id INTEGER, Lastname VARCHAR(128) )" ); } public void save() { update("insert INTO Customers (Id, Lastname) VALUES (?,?)",new Object[]{1,"Chris"}); update("insert INTO Customers (Id, Lastname) VALUES (?,?)",new Object[]{2,"Tina"}); } public int nocustomers() { return queryforint( "SELECT COUNT(*) FROM Customers" ); } } 21

Zugehörige Bean-Deklaration <bean id="dummydaotarget" class="com.tutego.spring.dao.jdbc.dummydao" init-method="initdatabase"> <property name="datasource"> <ref local="datasource" /> </property> </bean> 22

Testprogramm Ein Testprogramm gibt Anzahl Kunden aus, fügt dann die zwei Kunden ein und gibt wiederum die Anzahl Kunden aus. DummyDao bean = (DummyDao) context.getbean( "dummydaotarget" ); System.out.println( bean.nocustomers() ); try { bean.save(); } catch ( Exception e ) { e.printstacktrace(); } System.out.println( bean.nocustomers() ); Die erwartete Ausgabe: 0 2 23

Gedankenspiel Was passiert bei folgendem? public void save() { update("insert INTO Customers (Id, Lastname) VALUES (?,?)",new Object[]{1,"Chris"}); if ( 0 == 0 ) throw new RuntimeException( "Keine Lust mehr" ); } update("insert INTO Customers (Id, Lastname) VALUES (?,?)",new Object[]{2,"Tina"}); 24

Ausgabe mit Exception Wie erwartet fügt das Programm einen Datensatz ein. 0 java.lang.runtimeexception: Keine Lust mehr at com.tutego.spring.dao.jdbc.dummydao.save(dummydao.java:18) at com.tutego.spring.dao.jdbc.applicationtx.main(applicationtx.java:18) 1 Das Ziel ist es, dass die save()funktion entweder alle Operationen durchführt, oder gar keine. Die gewünschte Ausgabe ist 0 und 0. 25

DeklarativeTransaktionsdefinition Die Java EE macht es vor, dass der ApplicationServer über deklarative Transaktionen die Steuerung übernimmt. Auch in Spring ist das nicht anders. Dabei bietet Spring zwei Möglichkeiten: Einen Proxy nutzen und dort die Methoden mit ihren Transaktionsattributen definieren. Java 5 Annotationen verwenden. Der allgemeine Trick ist, dem Benutzer nicht mehr zum Beispiel ein Original-DAOzu geben, sondern ein Proxy, der die Methodenaufrufe abfängt und die transaktionale Steuerung übernimmt. Auf jeden Fall ist ein PlatformTransactionManager, der die Steuerung übernimmt. 26

PlatformTransactionManager Ein PlatformTransactionManagerist eine zentrale Schnittstelle in Springs Transaktionssteuerung. Ihn gibt es in verschiedenen Ausführungen: DataSourceTransactionManager. Nutzt Transkations- Managereiner gegebenen DataSource. Auch lokale Transaktion genannt. JtaTransactionManager. Bezieht den Transaktionsmanager vom Java EE Container, der unter dem Standard-Namen java:comp/usertransaction eingetragen ist. Auch globale Transaktion genannt. HibernateTransactionManager. Nutzt die Datenquelle, die bei der Hiberante-Session eingetragen ist. 27

DataSourceTransactionManager Für normale JDBC-Transaktionen schreiben wir: <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean> 28

TransactionProxyFactoryBean Als nächstes müssen wir einen Proxy bestimmen, durch den die Aufrufe gehen und der die transaktionalesteuerung übernimmt. Das ist bei Spring eine TransactionProxyFactoryBean. Sie wird konfiguriert mit: transactionmanager. Wer tatsächlich die Steuerung übernimmt. target. Die Original-Bean, um die diese Proxy sich legt. transactionattributes. DeklariveTransaktionsattribute für aufgezählte Methoden. Die Namensgebung empfiehlt, dass das Original mit Target endet. Der Proxy bekommt oft den Namen, den vorher das Target hatte. 29

TransactionProxyFactoryBeannutzen <bean id="txdummydao" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager" ref="transactionmanager"/> <property name="target" ref="dummydaotarget"/> <property name="proxytargetclass" value="true"/> <property name="transactionattributes"> <props> <prop key="*">propagation_required,-exception</prop> <prop key="get*">propagation_supports</prop> </props> </property> </bean> Zu den Attributen bei der Transaction-Propagation: http://static.springframework.org/spring/docs/2.5.x/reference/ transaction.html#tx-propagation 30

Neue Ausgabe mit Proxy 0 java.lang.runtimeexception: Keine Lust mehr at com.tutego.spring.dao.jdbc.dummydao.save(dummydao.java:17) at com.tutego.spring.dao.jdbc.dummydao$$fastclassbycglib$$b676da67.invoke(<generated>) at net.sf.cglib.proxy.methodproxy.invoke(methodproxy.java:149) at org.springframework.aop.framework.cglib2aopproxy$cglibmethodinvocation.invokejoinpoint(cglib2aopproxy.java:700) at org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:149) at org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:106) at org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:171) at org.springframework.aop.framework.cglib2aopproxy$dynamicadvisedinterceptor.intercept(cglib2aopproxy.java:635) at com.tutego.spring.dao.jdbc.dummydao$$enhancerbycglib$$af9177ef.save(<generated>) at com.tutego.spring.dao.jdbc.applicationtx.main(applicationtx.java:18) 0 31

Neuerungen in Spring 2 Seit Spring 2 gibt es eine Alternative zur TransactionProxyFactoryBean. Mit XML-Tagsaus dem Namensraum tx werden transaktionale Aspekte formuliert. http://static.springframework.org/spring/docs/2.5.x/ reference/transaction.html#tx-resource-synchronization http://jroller.com/raible/entry/migrating_to_spring_2_0 32

http://www.tutego.com/ Professionelle IT- Qualifizierung

tutego über tutego Inhouse-Schulungenmit individualisierten Inhalten und Terminauswahl 190 Seminare Kernkompetenz Java (60 Themen) Europaweit führende Position im Bereich Java-Schulungen Hochqualifizierte und zertifizierte Referenten Firmengründung 1997 durch Java Champion Christian Ullenboom 34

Unsere Themen 35

Unsere Themen 36