JDBC Java DataBase Connectivity SQL i Java Læreboken: 8.5, s. 393-397 Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen
JDBCs treenighet Databaseoppkobling java.sql.connection Utføre SQL java.sql.statement Behandle resultater java.sql.resultset (+ feilbehandling java.sql.sqlexception)
Eksempel 1. Koble opp 2. Legge in tabeller 3. Legge in poster 4. Søke 5. Koble ned
Databaseoppkobling 1. Driver Class.forName( oracle.jdbc.driver.oracledriver ); DriverManager Holder styr på drivere Lager Connection-objekt:
Databaseoppkobling 1. Connection Connection mycon = DriverManager.getConnection(url, bruker, pass ); url: database- og driveravhengig F.eks. jdbc:oracle:thin:@elefant.idi.ntnu.no: + 1521:ELEFANT
Connection: autocommit con.setautocommit(boolean) Default: true Committer etter hver executeupdate() Hvis false: Transaksjonsstyring con.commit() con.rollback()
Connection createstatement(), preparestatement(sql) Lager Statement-objekt close() Lukker databaseoppkoblingen
Koble opp public Connection connect() throws SQLException, ClassNotFoundException{ Class.forName("oracle.jdbc.driver.OracleDriver"); } Connection con = DriverManager.getConnection( jdbc:oracle:thin:@"+ "elefant.idi.ntnu.no:1521:elefant", "elefant", "test"); return con;
Koble ned public void disconnect(connection con)throws SQLException{ } con.close();
Statements To typer statements Statement Utføre SQL direkte PreparedStatememt Prekompilere SQL
Statement Sender SQL-setninger til databasen Lages ved hjelp av Connection objektet: Statement stmt = mycon.createstatement();
Statements tre metoder executeupdate(string sql) Resultat, antall rader påvirket (int) executequery(string sql) Resultat, svar på spørring (ResultSet) close()
Statement: executeupdate(sql) Alle SQL-setninger unntatt SELECT Eks. stmt.executeupdate( insert into post + values (5253, Sandsli ) ; Merk: Enkeltfnutter rundt SQL-stringer ( Sandsli ) Ikke semikolon til slutt i SQL-setningen Returverdi: antall rader påvirket (int)
Statement: executequery(sql) SELECT-setninger Eks. ResultSet rs = stmt.executequery( select * from post ); Returnerer ResultSet
Statement: close() Et Statement kan utføre mange SQL-setninger Bruk close() når du er ferdig Deallokerer ressurser Viktig hvis man lager mange Statementer man kan gå tom. NB: Husk å lukke statmements, ellers kan feilmeldinger som maximum open cursors exceeded oppstå
PreparedStatement Sender også SQL-setninger til databasen Prekompilering av SQL-setning Effektivt ved gjentakelse, ryddigere kode(?) Lages ved hjelp av Connection objektet: Statement stmt = mycon.preparestatement(sql);
PreparedStatement tre metoder executeupdate() Resultat, antall rader påvirket (int) executequery() Resultat, svar på spørring (ResultSet) close() SQLen lages i konstruktøren, metoder uten paramter
PreparedStatement; eksemepl PreparedStatement ps = mycon.preparestatement( insert into post + values (?,?) ); ps.setint(1,5253); ps.setstring(2, Sandsli ); ps.executeupdate();
ResultSet Innholder resultat av en SQL spørre setning. Resultat av en: executequery() executequery(sql)
ResultSet Tabell med resultat og peker 1 Postnr 2 Sted 5014 Bergen 5252 Søreidgrend 5253 Sandsli
ResultSet: next() Flytter pekeren til neste rad (hvis det er noen) Returnerer boolean true hvis raden finnes 1 Postnr 2 Sted 5014 Bergen 5252 Søreidgrend 5253 Sandsli
ResultSet: next() Flytter pekeren til neste rad (hvis det er noen) Returnerer boolean true hvis raden finnes 1 Postnr 2 Sted 5014 Bergen 5252 Søreidgrend 5253 Sandsli
ResultSet: next() Flytter pekeren til neste rad (hvis det er noen) Returnerer boolean true hvis raden finnes 1 Postnr 2 Sted 5014 Bergen 5252 Søreidgrend 5253 Sandsli
ResultSet: getint(), getstring()... getxxx()-metoder for de fleste primitive typer + String, Date m.fl. Parameter: enten kolonnenummer (start fra 1) eller kolonnenavn
ResultSet: getxxx()-eksempler rs.getint(1) 5014 rs.getstring(2) Bergen rs.getstring( Post_NR ) 5014 1 Postnr 2 Sted 5014 Bergen 5252 Søreidgrend 5253 Sandsli
ResultSet: null rs.getint(1) 0 rs.getint(2) 0 1 Tall1 2 Tall2 536 635 0 null 4846 6483
ResultSet: wasnull() rs.getint(1) 0 rs.getint(2) 0 rs.wasnull() false rs.wasnull() true 1 Tall1 2 Tall2 536 635 0 null 4846 6483
ResultSet: close() Frigjør ressurser Meget viktig
Legge in tabeller public void createtables(connection con)throws SQLException{ Statement s = con.createstatement(); } s.executeupdate("create TABLE POST" + "(Post_NR NUMBER(4),"+ "Post_Sted VARCHAR2(20),"+ "PRIMARY KEY(POST_NR))"); s.close();
Legge in poster } public void insertposts(connection con)throws SQLException{ Statement s = con.createstatement(); s.executeupdate("insert into post values "+ "( 5014, 'Bergen')"); s.executeupdate("insert into post values "+ "( 5252, 'Soreidgrend')"); s.executeupdate("insert into post values "+ "( 5253, 'Sandsli')"); s.close();
Søk } public void searchforpeoplegivenpoststed(string poststed, Connection con) throws SQLException{ PreparedStatement ps = con.preparestatement( "select P_NR, NAVN from Person,Post where "+ "Person.Post_NR = POST.Post_NR AND Post_Sted=?"); ps.setstring(1, poststed); ResultSet rs = ps.executequery(); while (rs.next()) { } rs.close(); ps.close(); System.out.println("P_NR: +rs.getint(1)+"\t Navn: "+rs.getstring(2));
Søk } public void searchstatement( String poststed,connection con) Statement s = con.createstatement(); ResultSet rs = s.executequery("select P_NR,"+ while (rs.next()) { } rs.close(); s.close(); " NAVN from Person,Post where "+ "Person.Post_NR = POST.Post_NR "+ "AND Post_Sted='"+postSted+"'"); throws SQLException{ System.out.println("P_NR: "+rs.getint(1)+"\t Navn: "+rs.getstring(2));
Hjelp http://java.sun.com/j2se/1.4.1/docs/api/ http://www.idi.ntnu.no/~sif8020/oppskrifter/jdbc.html http://java.sun.com/docs/books/tutorial/jdbc/ http://developer.java.sun.com/developer/books/jdbctutorial/ Oracle JDBC kan bli funnet på: http://www.idi.ntnu.no/emner/tdt4145/programvare/ojdbc14.jar