1 2 Java Database Connectivity (JDBC) Norvald H. Ryeng ryeng@idi.ntnu.no 3 4 Denne forelesningen Hva er Derby og Java DB? Hva er Derby og Java DB? Hva er JDBC? Slik fungerer det Slik gjør dere det (kokebok) Apache Derby er et DBMS skrevet i og for Java Java DB er Suns distribusjon av Apache Derby Kan kjøre som egen prosess (network server) Kan integreres og kjøres i samme JVM som applikasjonen (embedded) Krever at man gjør litt ekstra magi
7 8 Hva er JDBC? De viktigste grensesnittene Vanligste måte å bruke databaser i Java Følger med JRE og JDK (java.sql.*) Uavhengig av DBMS (krever driver) Spørringer skrives i SQL java.sql.connection Tilkobling til en databasetjener java.sql.statement Brukes for å utføre spørringer mot databasen java.sql.resultset Resultatet av en spørring 9 10 Koble til databasetjeneren java.sql.connection Laste driver vha. Class.forName() Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); Koble til med DriverManager: Holder styr på drivere Lager tilkoblinger (Connection-objekter) Connection conn = DriverManager.getConnection( );.createstatement() Lag et Statement-objekt.prepareStatement( ) Lag en halvferdig spørring.setautocommit( ) Commit etter hver executequery/executeupdate? (Standard: ja).commit().rollback() 11 12 java.sql.statement.executeupdate("insert INTO tabell VALUES ( )") Utfører en operasjon som ikke returnerer noe resultat (f.eks. INSERT og UPDATE). Returnerer antall rader som påvirkes..executequery("select * FROM tabell") Utfører en spørring og returnerer et ResultSet med svar på spørringen. Halvferdig spørring hvor man bare fyller ut verdier Effektivt ved gjentatte spørringer Sikrere Penere kode? Ryddigere å definere spørringen bare ett sted Mange linjer for lite arbeid
13 14 PreparedStatement ps = conn.preparestatement("insert INTO Poststed " + "VALUES (?,?)"); Her daughter is named Help I'm trapped in a driver's license factory. xkcd by Randall Munroe, http://xkcd.com/327/ ps.setint(1, 9040); ps.setstring(2, "NORDKJOSBOTN"); ps.executeupdate(); ps; 15 16 java.sql.resultset java.sql.sqlexception.next() Går til neste rad. Starter før første rad, så man må kalle next() før man gjør noe annet. Returnerer true hvis det er en neste rad og false hvis det ikke er flere rader igjen..getint(k) Leser en int fra kolonne k. k kan enten være kolonnenummeret (starter på 1) eller kolonnenavnet..getstring(k) Leser en String fra kolonne k. Unntak som kastes dersom noe går galt Må fanges og håndteres Løsning: sett alle JDBC-operasjoner innenfor try{ }: try { // JDBC-kode } catch (SQLException e) { // Ev. catch (Exception e) e.printstacktrace(); } 17 18 Spørsmål? Kokebok
19 20 0. Importer java.sql.* 1. Last inn Derby-driveren import java.sql.*; Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); Importerer JDBC-pakken inn i navnerommet, slik at man slipper å skrive java.sql. foran alle klasse- og grensesnittnavn. Sørger for at vi kan snakke med databasetjeneren Følger med nyere Java 21 22 2. Koble til databasen 3. Lag et Statement-objekt Connection conn = DriverManager.getConnection("jdbc:derby:mindb ); Statement stmt = conn.createstatement(); Sørger for å sende SQL-setninger til databasetjeneren. Kan sende spørringer som returnerer resultat (SELECT) Kan sende spørringer som ikke returnerer resultat (INSERT, DELETE) 23 24 4. Utfør spørringen 5. Les resultatet ResultSet rs = stmt.executequery("select * " + "FROM poststed WHERE sted='trondheim' "); Merk: Ikke semikolon på slutten av spørringen Apostrof rundt tekststrenger while (rs.next()) { System.out.print(rs.getInt(1)); System.out.print( ); System.out.println(rs.getString(2)); } getxxx() finnes for de viktigste datatypene Tar kolonnenummer eller navn som parameter
25 26 6. Lukk ResultSet-objektet 7. Lukk Statement-objektet rs; stmt; Veldig viktig! Hvis man har for mange ResultSet-objekter oppe, vil man få en feil når man utfører neste spørring. Et Statement-objekt kan brukes flere ganger Dvs. at man kan kjøre.executequery() og.executeupdate() flere ganger med samme Statement-objekt. Hvorfor ha flere Statement-objekter? Man kan kun ha ett ResultSet-objekt åpent for hvert Statement-objekt. 27 28 8. Lukk Connection-objektet 9. Avslutt integrert Derby conn; Kobler fra databasetjeneren try { DriverManager.getConnection( jdbc:derby:;shutdown=true ); } catch (SQLException e) { /* alltid */ } Skriver sjekkpunkt Ikke nødvendig for andre DBMS N.B. Kaster alltid unntak! 29 30 Mer informasjon Java API-dokumentasjon http://java.sun.com/javase/6/docs/api/ Notater og veiledninger fra TDT4145 http://www.idi.ntnu.no/emner/tdt4145/oppskrifter/ Spørsmål? The Java Tutorial JDBC Database Access http://java.sun.com/docs/books/tutorial/jdbc/index.html Apache Derby Tutorial http://db.apache.org/derby/papers/derbytut/index.html