1 / 20

Å programmere mot en database

Å programmere mot en database.

marci
Download Presentation

Å programmere mot en database

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Å programmere mot en database Hva er JDBC? side 2Databasedrivere side 3Eksempeldatabase side 4Å få kontakt med databasen side 5Sammenhengen mellom SQL datatyper, Java datatyper og getxxx()-metoder side 6Et større eksempel side 7-8Databaseforbindelser, lage egen pool side 9-10Trelagsarkitektur, bruke poolen side 11-17Transaksjoner side 18JDBC2 side 19 Kompilerte SQL-setninger side 20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  2. Hva er Java Database Connectivity (JDBC)? • JDBC er • ikke et databasesystem, men muliggjør kommunikasjon med et slikt • ikke et ”pek og klikk, dra og slipp”-verktøy som for eksempel Microsoft Access, men de som lager slike verktøy kan bruke JDBC til å kommunisere med databasen. • JDBC er et API som tilbyr klasser og metoder for å sende SQL-setninger til en database, og få et resultat tilbake. • Dette kapitlet forutsetter kjennskap til relasjonsdatabaser og SQL. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  3. Databasedrivere Java- applikasjon Java- applikasjon Java- applikasjon JDBC Driver Manager JDBC-til-ODBC- driver Oracle-driver Sybase-driver ODBC-driver En databasedriverbestår av klassersom implementererbestemte interface. Sybase Database Oracle Database Microsoft Access Microsoft SQL Server Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  4. Eksempeldatabase create table person( persnr integer primary key, fornavn varchar(30) not null, etternavn varchar(30) not null); insert into person values (100, 'OLE', 'HANSEN'); insert into person values (101, 'ANNE GRETHE', 'ÅS'); insert into person values (102, 'JONNY', 'HANSEN'); Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  5. Et eksempel på kontakt med databasen public static void main(String[] args) throws Exception { String databasedriver = "oracle.jdbc.driver.OracleDriver"; Class.forName(databasedriver); // laster inn driverklassen String databasenavn = "jdbc:oracle:thin:@loiosh.stud.aitel.hist.no:1521:orcl"; String brukernavn = showInputDialog("Brukernavn: "); String passord = showInputDialog("Passord: "); Connection forbindelse = DriverManager.getConnection(databasenavn, brukernavn, passord); Statement setning = forbindelse.createStatement(); ResultSet res = setning.executeQuery("select * from person"); while (res.next()) { int persNr = res.getInt("persnr"); String fornavn = res.getString("fornavn"); String etternavn = res.getString("etternavn"); System.out.println(persNr + ": " + fornavn + " " + etternavn); } res.close(); setning.close(); forbindelse.close(); } byttes ut hvis annen databasedrivereller database Vår databasedriver ligger på classes111.zip. CLASSPATH må inneholde classes111.zip.Denne filen inneholder bl.a. oracle.jdbc.driver.OracleDriver. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  6. CHAR, VARCHAR, LONGVARCHAR String getString() NUMERIC, DECIMAL java.math.BigDecimal getBigDecimal() BIT boolean getBoolean() TINYINT byte getByte() SMALLINT short getShort() INTEGER int getInt() BIGINT long getLong() REAL float getFloat() FLOAT, DOUBLE double getDouble() BINARY, VARBINARY, LONGVARBINARY byte[] getBytes() DATE java.sql.Date getDate() TIME java.sql.Time getTime() TIMESTAMP java.sql.Timestamp getTimestamp() Sammenhengen mellom SQL datatyper, Java datatyper og getxxx()-metoder Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  7. Et større eksempel Database forbindelse: Connection finnAlle(): ArrayList<Person> endreNavn(personen: Person): boolean registrerNyPerson(fornavn: String, etternavn: String): Person slettPerson(nr: int): boolean kobleNedForbindelse(): void Vis programliste 20.2 side 722-727. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  8. En databaseapplikasjon Vis programliste 20.3 side 728-732. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  9. Databaseforbindelser er en krevende ressurs • Her • en bruker får tildelt en databaseforbindelse i det han starter programmet • forbindelsen holdes fram til brukeren velger å avslutte programmet • brukbart dersom antall brukere er relativt få • Dersom antall brukere er mange • en pool av databaseforbindelser • hver henvendelse til databasen begynner med å reservere en forbindelse som ikke holdes lenger enn nødvendig • “connection pooling” en del av JDBC 2.0 • sjekk [URL-Databasedrivere] for drivere som tilbyr denne tjenesten • krever at Java navne- og katalogtjeneste (JNDI) kjører, ikke aktuelt for oss • vi lager vår egen pool Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  10. Vår egen pool av databaseforbindelser • En databasepool består av et sett med databaseforbindelser • Forbindelsene opprettes i konstruktøren (ikke vist på figuren) • Forbindelsene koples ned ved kall på lukkAlleForbindelser( ), i profesjonelle systemer koples de ofte ned på timeout. Forbindelse DatabasePool -nr -dbForb -ledig 1 * -kapasitet -dbNavn -brukernavn -passord pakke-tilgang settLedig lukkForbindelse +finnNr +finnForbindelse +erLedig +reserverForbindelse +frigiForbindelse +lukkAlleForbindelser Vis programliste 20.4 side 734-738. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  11. Trelagsarkitektur Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  12. Klienter deler databasepoolen Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  13. En fabrikk tildeler databaseobjekter Fabrikken registreres i rmi-registeret Grensesnitt: public interface DbWrapperFabrikk extends Remote { Database lagDbWrapper() throws RemoteException; } Implementasjon: public class DbWrapperFabrikkImpl extends UnicastRemoteObject implements DbWrapperFabrikk { private DatabasePool dbPool; private int feilkode; // brukes i registrerNyPerson() // i klassen DatabaseImpl public DbWrapperFabrikkImpl(int poolKapasitet, String dbDriver, String dbNavn, String brukernavn, String passord,int startFeilkode) throws Exception { dbPool = new DatabasePool(poolKapasitet, dbDriver, dbNavn, brukernavn, passord); feilkode = startFeilkode; } public Database lagDbWrapper() throws RemoteException { return new DatabaseImpl(dbPool, feilkode); } /* Denne metoden er ikke med i interfacet, men brukes av tjenerprogrammet */ public void stengDatabasePool() { dbPool.lukkAlleForbindelser(); } } Fjernobjekt som tildeler en databasewrapper Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  14. Databasewrapperen • Grensesnitt: public interface Database extends Remote { ArrayList<Person> finnAlle() throws RemoteException; boolean endreNavn(Person personen) throws RemoteException; Person registrerNyPerson(String fornavn, String etternavn) throws RemoteException; boolean slettPerson(int nr) throws RemoteException; } • Implementasjonen ligner på klassen Database (side 722ff.), men databaseforbindelser reserveres og frigis i hver enkelt metode, se eksempel på metode på neste lysbilde public class DatabaseImpl extends UnicastRemoteObject implements Database { private DatabasePool dbPool; private int kode; // Returkode fra databasesystemet ved primærnøkkelkonflikt public DatabaseImpl(DatabasePool startDbPool, int startKode) throws RemoteException { dbPool = startDbPool; kode = startKode; } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  15. Metode som bruker databasepoolen • Metoden ligger i klassen DatabaseImp (forts. fra forrige lysbilde) public ArrayList<Person> finnAlle() throws RemoteException { ArrayList<Person> alle = new ArrayList<Person> (); String sqlsetning ="select persnr, initcap(fornavn) as fn, initcap(etternavn) as en " + "from person order by etternavn, fornavn"; Forbindelse forbindelse = null; ResultSet res = null; Statement setning = null; try { forbindelse = dbPool.reserverForbindelse(); setning = forbindelse.finnForbindelse().createStatement(); ... finner data og fyller opp tabell-listen, se klassen Database … } finally { // setningene nedenfor utføres alltid lukkResSet(res); lukkSetning(setning); dbPool.frigiForbindelse(forbindelse.finnNr()); return alle; } } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  16. Tjenerprogrammet class DatabaseTjener { public static void main(String[] args) throws Exception { String dbDriver = "oracle.jdbc.driver.OracleDriver"; String dbNavn = "jdbc:oracle:thin:@baron.stud.idb.hist.no:1521:orcl"; String brukernavn = showInputDialog("Brukernavn: "); String passord = showInputDialog("Passord: "); int feilkode = 1; // Oracle feilkode for duplikate primærnøkkelverdier int poolKapasitet = 3; DbWrapperFabrikkImpl db = new DbWrapperFabrikkImpl(poolKapasitet, dbDriver, dbNavn, brukernavn, passord, feilkode); Naming.rebind("Persondatabase", db); showMessageDialog(null, "Nå er databasepoolen oppe. Trykk Ok når den skal stenges."); db.stengDatabasePool(); // NB! System.exit(0); } } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  17. De tre lagene kjører på hver sin maskin Kompiler og kjør som forklart under figuren på side 742. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  18. Transaksjoner • En transaksjon er en logisk enhet med arbeid og kan bestå av flere oppdateringssetninger mot databasen. • Eksempel: Dersom penger skal overføres fra én konto til en annen er det viktig at begge kontoene endrer saldo. Dersom en feil inntreffer kan vi ikke risikere at bare en av kontoene har endret saldo. • OK gjennomført transaksjon: Stadfest! (commit) • Ikke ok gjennomført transaksjone: Rull tilbake! (rollback) • Hver SQL-setning er en transaksjonsenhet. • Interfacet Connection gir oss mulighet til å lage transaksjoner som består av mer enn en SQL-setning • public void setAutoCommit(boolean autocommit) // standard er true • public void commit() • public void rollback() Vis programliste 20.5 side 744-745. Gjør oppgaven side 746. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  19. JDBC2 • Utvidete muligheter i ResultSet • Metoder merket 1.2 i API-dokumentasjonen (siste avsnitt i deltaljbeskrivelsen er ”Since: 1.2”) krever en JDBC2-driver (Oracle: ojdbc14.jar) • Kan flytte deg framover og bakover. • Kan legge inn nye rader, oppdatere data og slette rader i databasen via resultatsettet, men executeUpdate( ) er vanligvis mer effektivt • Mange oppdateringssetninger kan samles og sendes til databasesystemet som en pakke (”batch”): for (int nr = 2001; nr < 2010; nr++) { String sql = "insert into person values(" + nr + ", 'Ola', 'Nordmann')"; System.out.println(sql); setning.addBatch(sql); } int[] antall = setning.executeBatch(); • Les mer i for eksempel http://java.sun.com/developer/Books/JDBCTutorial/index.html Gjør oppgavene side 746-747. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

  20. Kompilerte SQL-setninger • Java-programmet sender SQL-setningen til databasesystemet. • Databasesystemet kompilerer setningen og setter opp en plan for mest mulig effektivt søk i databasen. • Unødvendig å kompilere på nytt dersom bare konstantverdier byttes ut: • select * from person where fornavn like ”Anne” and etternavn like ”Olsen”; • select * from person where fornavn like ”Ulf” and etternavn like ”Hansen”; • Vi kan lage et ferdig kompilert setningsobjekt ved å bruke klassen PreparedStatement. Eksempel: String sqlSetning = "select * from person where fornavn like ? and etternavn like ?"; PreparedStatement setning = forbindelse.prepareStatement(sqlSetning); setning.setString(1, ”Anne”); // Søkekriteriene kan selvfølgelig leses inn, setning.setString(2, ”Olsen”); // se programliste 20.6 side 748-749. ResultSet res = setning.executeQuery(); while (res.next()) { …osv…. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.

More Related