370 likes | 526 Views
JDBC. Java DataBase Connectivity SQL i Java Læreboken: 8.5, s. 393-397 Forelesning i TDT4145, 14. april 2005 Av Gisle Grimen. JDBCs treenighet. Databaseoppkobling – java.sql.Connection Utføre SQL – java.sql.Statement Behandle resultater – java.sql.ResultSet
E N D
JDBC • Java DataBase Connectivity • SQL i Java • Læreboken: 8.5, s. 393-397 Forelesning i TDT4145, 14. april 2005 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 • Koble opp • Legge in tabeller • Legge in poster • Søke • Koble ned
Databaseoppkobling • Driver • Class.forName(”oracle.jdbc.driver.OracleDriver”); • DriverManager • Holder styr på drivere • Lager Connection-objekt:
Databaseoppkobling • Connection • Connection con = 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 – flere metoder • 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 = con.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: PreparedStatement stmt = con.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 = con.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”
ResultSet: next() • Flytter pekeren til neste rad (hvis det er noen) • Returnerer boolean – true hvis raden finnes
ResultSet: next() • Flytter pekeren til neste rad (hvis det er noen) • Returnerer boolean – true hvis raden finnes
ResultSet: next() • Flytter pekeren til neste rad (hvis det er noen) • Returnerer boolean – true hvis raden finnes
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”
ResultSet: null • rs.getInt(1) 0 • rs.getInt(2) 0
ResultSet: wasNull() • rs.getInt(1) 0 rs.wasNull() false • rs.getInt(2) 0 rs.wasNull() true
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()) { System.out.println("P_NR: ”+rs.getInt(1)+"\t Navn: "+rs.getString(2)); } rs.close(); ps.close(); }
Søk public void searchStatement(String postSted,Connection con) throws SQLException{Statement s = con.createStatement(); ResultSet rs = s.executeQuery("select P_NR,"+ " NAVN from Person,Post where "+ "Person.Post_NR = POST.Post_NR "+ "AND Post_Sted='"+postSted+"'"); while (rs.next()) { System.out.println("P_NR: "+rs.getInt(1)+"\t Navn: "+rs.getString(2)); } rs.close(); s.close(); }
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