F07_JDBC.1 FÖ 07 - JDBC Åtkomst till databaser från applikationer med Java - exempelkod -
F07_JDBC.2 Anslutning till en databas kräver en drivrutin för ändamålet. För Java: JDBC = Java Database Connectivity (utvecklat av Sun Systems) Info: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136101.html Utgör ett API (application programming interface) för Java. Definierar hur en klient (t.ex. ett Javaprogram) får göra för att komma en databas: Ett antal metoder i ett antal Javaklasser i paketet java.sql. För varje DBMS (MySQL, Postgres, SQL Server, ) behövs en speciell drivrutin (driver). För MySQL finns drivrutiner för olika språk kallade connector Nedladdning: http://www.mysql.com/products/connector/ Den som numera är avsedd för Java är Connector/J (finns äldre sätt som Oracle avråder från, även om de fortfarande finns, t.ex. Connector/ODBC, sämre funktionalitet m.m.). Alla anrop till MySQL-databasen från Java görs via Connector/J. Handbok: http://dev.mysql.com/usingmysql/java/ Senaste versionen: mysql-connector-java-gpl-5.1.23.msi Visa installation av Connector/J och länkningen till JAR-filen i Project Library.
F07_JDBC.3 Anslut till mysql-databasen med JDBC // Paketet java.sql är ett API för åtkomst till databaser med SQL eller andra // datakällor med data organiserade i rader och kolumner. import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.sql.resultsetmetadata; import java.sql.callablestatement; import java.util.date; import java.text.simpledateformat; import java.util.calendar; //Demo: Ansluter till en DB, hämtar och manipulerar data, visar resultat atet.
public class DB_demo { F07_JDBC.4 public static void main(string[] args) { try { //1. LADDA DBMS-DRIVRUTINEN (här JDBC/J). //Rent teknisk registreras nu JDBC/J Connector av objektet Drivermanager, //vilket strax används för att erhålla en förbindelse med databasen. //För att detta ska fungera måste drivrutinen ha laddats ner och //installerats, och sökvägen till JAR-filen ha gjorts känd för Netbeans. Class.forName("com.mysql.jdbc.Driver");
F07_JDBC.5 //2. Skapa ANSLUTNINGSSESSION med interfacet Connection. //Klassen DriverManager är grundtjänsten för att hantera drivrutiner //för DB och innehåller metoder för att skapa anslutning m.m. //Parametrar (alla som strängar): // URL till datakällan (servern är "//localhost" och databasen // "/work_schedule"). // Obs frågetecknet sist. (MySQL Server måste ha konfigurerats till att // acceptera externa TCP/IP-anslutningar, vilket brukar vara default vid // installationen.) // Kontonamn, User name etc. // Lösenord. Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost/work_schedule?" + "user=dba&password=dba999"); //Anslutning till din databas från kursen DoD: //Connection conn = DriverManager.getConnection( // "jdbc:mysql://mysql.iei.liu.se/group99_data?" // + "user=group99&password=lösenordet"); Visa: DB_demo_1_KollaAnslutning.java
//3. Skapa ett STATEMENT (ett objekt som exekverar en SQL-sats och // returnerar resultatet). // Har metoder för manipulation av data, hämtning av metadata mm. // Om ingen parameter anges, dvs Statement stmt=con.createstatement(), // är default: // Typ av ResultSet: TYPE_FORWARD_ONLY. // Concurrency level: CONCUR_READ_ONLY. // Det returnerade ResultSet går ej att uppdatera och kan endast // genomlöpas en gång från första till sista post. // Sammanfattning av möjliga parametrar: // http://w3processing.com/index.php?submenuid=140 Statement stmt = conn.createstatement(); F07_JDBC.6 //Nedanstående anrop gör, att ResultSet kan genomlöpas flera //gånger i olika riktningar och att det inte påverkas av eventuella //ändringar i sin datakälla samt att det är uppdateringsbart. // Statement stmt = conn.createstatement( // ResultSet.TYPE_SCROLL_INSENSITIVE, // ResultSet.CONCUR_UPDATABLE );
F07_JDBC.7 //4. Skicka SQL-fråga till databasen. // Metoden executequery returnerar ett ResultSet-objekt // som innehåller hela resultatet av frågan (ett antal rader). // Obs, mellanslagen i slutet av delsträngarna. ResultSet rs = stmt.executequery( "SELECT staff_id, tu_begin, tu_end, job_id " + "FROM work_schedule.staff_periods sp, work_schedule.timeunits t " + "WHERE sp.tu_id = t.tu_id " + "ORDER BY staff_id, tu_begin");
F07_JDBC.8 //5. Gör något med resultatet. // Skriv ut resultatet med en egentillverkad assistentmetod (se nedan). printtable(rs);
F07_JDBC.9 ------------------------------------------------------------------------------ //ASSISTENTMETOD för att skriva ut resultatmängden som strängar. //(Måste vara STATIC pga anropas från MAIN som är static.) private static void printtable (ResultSet rs) throws SQLException { int colwidth = 24; //Kolumnbredd //Hämta kolumnnamnen (ResultSetMetaData har metoder för att ta fram diverse //metadata rörande resultatmängden). ResultSetMetaData rsmd = rs.getmetadata(); String s = new String(); //Skriv ut kolumnnamnen (padright fyller med mellanslag till höger) for (int i = 1; i <= rsmd.getcolumncount(); i++) { s = s + padright(rsmd.getcolumnname(i), colwidth); System.out.println(s); //Skriv ut raderna while (rs.next()) //Radvis bearbetning { s =""; //Kolumn för kolumn på raden. getstring(i) = värdet i kolumncellen for (int i = 1; i <= rsmd.getcolumncount(); i++) { s = s + padright(rs.getstring(i), colwidth); System.out.println(s);
F07_JDBC.10 // ASSISTENTMETOD för att fylla en sträng med mellanslag i höger ände // till en viss längd public static String padright(string thevalue, int length) { return String.format("%1$-" + length + "s", thevalue); // %1$ = parametern, värdet för variabeln the Value kommer att sättas på // dess plats. // - = vänsterjustera. // n = strängens längd sätts till värdet för variabeln length (antal // tecken i strängen). // s = konvertera resultatet till en sträng. -------------------------------------------------------------------------------- Visa: DB_demo2
F07_JDBC.11 //6. Osv... //Skapa en ny STATEMENT utan parametrar pga de inte behövs för att utföra //executeupdate. Statement stmt2 = conn.createstatement(); //Lägg till en rad. //Kom ihåg att ändra staff_id mellan varje exekvering, annars //primärnyckelfel. stmt2.executeupdate("insert INTO staff VALUES (51, 'Nisse Manpower')" ); /* ETT ANNAT SÄTT ATT GÖRA DENNA INSERT: // Behövs: import java.sql.preparedstatement; PreparedStatement ps; //? är place holder ps = conn.preparestatement ("INSERT INTO staff VALUES(?,?)"); int nr = 52; ps.setint (1, nr ); //Placeholder 1 med en variabel ps.setstring (2, "Nisse Manpower"); //Placeholder 2 med direkt värde int count = ps.executeupdate (); ps.close (); */
F07_JDBC.12 //Uppdatera några rader stmt2.executeupdate("update work_schedule.staff_periods SET job_id = 2 " + "WHERE staff_id = 38 AND job_id IS NULL"); //Uppdatera några rader med infogning av variabelvärde från Javakoden int jnr = 3; stmt2.executeupdate("update work_schedule.staff_periods SET job_id = " + jnr + " WHERE staff_id = 5345" ); //Sätt cursorn till positionen innan den första posten så att //resultatmängden kan läsas en gång till. //Konvertera sedan värdena till rätt datatyper med den egentillverkade //assistentmetoden converttblsptypes. rs.beforefirst(); converttblsptypes (rs);
F07_JDBC.13 -------------------------------------------------------------------------------- //En ASSISTENTMETOD för att konvertera värdena från staff_periods //till rätt datatyper i Java. private static void converttblsptypes(resultset rs) throws SQLException { //Variablerna i Java som ska användas för resultatmängdens kolumner. short staff_id = 0; Date time_start = null; int jobb_id; System.out.println (">>> Typkonverterade värden:"); //Datum på formen 2012-03-07 16:30:05 för att få bort.0 från 16:30:05.0 // (nanosekunderna i Timestamp). Formatet används i loopen. SimpleDateFormat dateform = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //Hämta värdet från namngiven kolumn och konvertera det till önskad datatyp. //Övriga konverteringsmetoder av intresse: getbigdecimal, getboolean, //getbyte, getdouble, getfloat, getlong, getstring, gettime. while (rs.next()) //Radvis bearbetning { //staff_id i mysql är SMALLINT, i Java är det SHORT (-32,768 - +32,767) staff_id = rs.getshort("staff_id"); //DATETIME i mysql har ingen direkt motsvarighet i Java. Konverteras till //ett DATE-objekt för att kunna manipulera delar av datum och tid. //Metoden gettimestamp används för att få med både datum och klockslag, //dock följer nanosekunderna med som decimaler till klockslaget, dvs //2012-03-08 08:00:00.0 time_start = rs.gettimestamp("tu_begin"); //Decimalerna för sekunderna tas bort, dvs 012-03-08 08:00:00 String time_start_ok = dateform.format(time_start);
F07_JDBC.14 //Sluttiden med sekunddecimalerna borta (kompaktare skrivet än ovan) // time_end = rs.gettimestamp("tu_end"); // String time_end_ok = dateform.format(timeend); String time_end_ok = dateform.format( rs.gettimestamp("tu_end") ); //INT i mysql är Int i Java; heltal från -2147483648 t.o.m. 2147483647. jobb_id = rs.getint("job_id"); //Veckodag o månad med text, tidzonsförkortningen anges //(formateringmöjligheter finns) Date mydate = new java.util.date(time_start.gettime()); //Här skrivs variablerna endast ut. // Egentligen ska de här stoppas in i den Java-datastruktur där man // vill ha dem. System.out.println(staff_id + "\t" + time_start_ok + "\t" + time_end_ok + "\t" + jobb_id+ "\t" + mydate); // END while // END method ------------------------------------------------------------------------------- Visa: DB_demo3a
F07_JDBC.15 -------------------------------------------------------------------------------- OBS, klassen CALENDAR kräver denna import: import java.util.calendar; //En ASSISTENTMETOD för att konvertera värdena från staff_periods //till rätt datatyper i Java. private static void converttblsptypes(resultset rs) throws SQLException { //Variablerna i Java som ska användas för resultatmängdens kolumner. short staff_id = 0; //Annars felmeddelande om "Not inititalized". Date time_start, time_end; int jobb_id; System.out.println (">>> Typkonverterade värden:"); //Datum på formen 2012-03-07 16:30:05 för att få bort.0 från 16:30:05.0 // (nanosekunderna i Timestamp). Formatet används i loopen för att skriva // ut datumet som en sträng med önskat datumformat (interna formatet är // det amerikanska) SimpleDateFormat dateform = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
F07_JDBC.16 //Hämta värdet från namngiven kolumn och konvertera det till önskad datatyp. //Övriga konverteringsmetoder av intresse: getbigdecimal, getboolean, //getbyte, getdouble, getfloat, getlong, getstring, gettime. while (rs.next()) //Radvis bearbetning { //staff_id i mysql är SMALLINT, i Java är det SHORT (-32,768 - +32,767). staff_id = rs.getshort("staff_id"); //DATETIME i mysql har ingen direkt motsvarighet i Java. Konverteras till //ett DATE-objekt för att kunna manipulera delar av datum och tid. //Metoden gettimestamp används för att få med både datum och klockslag, // dock följer nanosekunderna med som decimaler till klockslaget. //Ett av de enkla sätten att bli kvitt nanosekunderna är att konvertera //via ett Calendar-objekt, eftersom det inte tar med nanosekunder. //Skapa ett Calendar-objekt och tilldela det Timestamp-värdet från //JDBC:s ResultSet. Nanosekunderna är nu borta. Calendar cal = Calendar.getInstance(); cal.settime(rs.gettimestamp("tu_begin")); //Datum och klockslag från Calendar-objektet tilldelas Date-objektet. //Det innehåller nu datum och klockslag i amerikansk datumformat. time_start= cal.gettime(); //Samma för sluttiden cal.settime(rs.gettimestamp("tu_end")); time_end = cal.gettime(); //INT i mysql är Int i Java; heltal från -2147483648 t.o.m. 2147483647. jobb_id = rs.getint("job_id");
F07_JDBC.17 //Här skrivs variablerna endast ut. I stället ska de stoppas in i den //Java-datastruktur där man vill ha dem. //För att skriva ut datumen i vårt datumformat används det ovan // definierade formatet dateform. Prova gärna utskrift utan denna // formattering! System.out.println(staff_id + "\t" + time_start + "\t" + time_end + "\t" + jobb_id); -------------------------------------------------------------------------------- Visa: DB_demo3b
(Main-metoden igen.) F07_JDBC.18 //Anropa en Stored Procedure som inte returnerar några värden. //(Denna SP återställer de ursprungliga värdena i tabellerna staff_periods //och staff.) CallableStatement cs = conn.preparecall( "{call sp_restorestaffperiods" ); cs.execute(); //Stäng anslutningen stmt.close(); stmt2.close(); cs.close(); conn.close(); catch (Exception e) { System.out.println("ERROR: " + e.getmessage() );
Exekveringen av DB_demo3a ger denna utskrift: F07_JDBC.19 staff_id tu_begin tu_end job_id 38 2012-03-08 08:00:00.0 2012-03-08 08:30:00.0 4 38 2012-03-08 08:30:00.0 2012-03-08 09:00:00.0 4 38 2012-03-08 09:00:00.0 2012-03-08 09:30:00.0 4 123 2012-03-08 08:00:00.0 2012-03-08 08:30:00.0 null 123 2012-03-08 08:30:00.0 2012-03-08 09:00:00.0 4 123 2012-03-09 08:00:00.0 2012-03-09 08:30:00.0 2 123 2012-03-09 08:30:00.0 2012-03-09 09:00:00.0 4 123 2012-03-10 08:00:00.0 2012-03-10 08:30:00.0 null 123 2012-03-10 08:30:00.0 2012-03-10 09:00:00.0 4 211 2012-03-08 08:00:00.0 2012-03-08 08:30:00.0 null 211 2012-03-09 08:00:00.0 2012-03-09 08:30:00.0 1 211 2012-03-09 08:30:00.0 2012-03-09 09:00:00.0 1 211 2012-03-09 09:00:00.0 2012-03-09 09:30:00.0 1 211 2012-03-10 08:00:00.0 2012-03-10 08:30:00.0 null >>> Typkonverterade värden: 38 2012-03-08 08:00:00 2012-03-08 08:30:00 4 Thu Mar 08 08:00:00 CET 2012 38 2012-03-08 08:30:00 2012-03-08 09:00:00 4 Thu Mar 08 08:30:00 CET 2012 38 2012-03-08 09:00:00 2012-03-08 09:30:00 4 Thu Mar 08 09:00:00 CET 2012 123 2012-03-08 08:00:00 2012-03-08 08:30:00 0 Thu Mar 08 08:00:00 CET 2012 123 2012-03-08 08:30:00 2012-03-08 09:00:00 4 Thu Mar 08 08:30:00 CET 2012 123 2012-03-09 08:00:00 2012-03-09 08:30:00 2 Fri Mar 09 08:00:00 CET 2012 123 2012-03-09 08:30:00 2012-03-09 09:00:00 4 Fri Mar 09 08:30:00 CET 2012 123 2012-03-10 08:00:00 2012-03-10 08:30:00 0 Sat Mar 10 08:00:00 CET 2012 123 2012-03-10 08:30:00 2012-03-10 09:00:00 4 Sat Mar 10 08:30:00 CET 2012 211 2012-03-08 08:00:00 2012-03-08 08:30:00 0 Thu Mar 08 08:00:00 CET 2012 211 2012-03-09 08:00:00 2012-03-09 08:30:00 1 Fri Mar 09 08:00:00 CET 2012 211 2012-03-09 08:30:00 2012-03-09 09:00:00 1 Fri Mar 09 08:30:00 CET 2012 211 2012-03-09 09:00:00 2012-03-09 09:30:00 1 Fri Mar 09 09:00:00 CET 2012 211 2012-03-10 08:00:00 2012-03-10 08:30:00 0 Sat Mar 10 08:00:00 CET 2012
Exekveringen av DB_demo3b ger denna utskrift: F07_JDBC.20 staff_id tu_begin tu_end job_id 38 2012-03-08 08:00:00.0 2012-03-08 08:30:00.0 4 38 2012-03-08 08:30:00.0 2012-03-08 09:00:00.0 4 38 2012-03-08 09:00:00.0 2012-03-08 09:30:00.0 4 123 2012-03-08 08:00:00.0 2012-03-08 08:30:00.0 null 123 2012-03-08 08:30:00.0 2012-03-08 09:00:00.0 4 123 2012-03-09 08:00:00.0 2012-03-09 08:30:00.0 2 123 2012-03-09 08:30:00.0 2012-03-09 09:00:00.0 4 123 2012-03-10 08:00:00.0 2012-03-10 08:30:00.0 null 123 2012-03-10 08:30:00.0 2012-03-10 09:00:00.0 4 211 2012-03-08 08:00:00.0 2012-03-08 08:30:00.0 null 211 2012-03-09 08:00:00.0 2012-03-09 08:30:00.0 1 211 2012-03-09 08:30:00.0 2012-03-09 09:00:00.0 1 211 2012-03-09 09:00:00.0 2012-03-09 09:30:00.0 1 211 2012-03-10 08:00:00.0 2012-03-10 08:30:00.0 null >>> Typkonverterade värden: 38 Thu Mar 08 08:00:00 CET 2012 Thu Mar 08 08:30:00 CET 2012 4 38 Thu Mar 08 08:30:00 CET 2012 Thu Mar 08 09:00:00 CET 2012 4 38 Thu Mar 08 09:00:00 CET 2012 Thu Mar 08 09:30:00 CET 2012 4 123 Thu Mar 08 08:00:00 CET 2012 Thu Mar 08 08:30:00 CET 2012 0 123 Thu Mar 08 08:30:00 CET 2012 Thu Mar 08 09:00:00 CET 2012 4 123 Fri Mar 09 08:00:00 CET 2012 Fri Mar 09 08:30:00 CET 2012 2 123 Fri Mar 09 08:30:00 CET 2012 Fri Mar 09 09:00:00 CET 2012 4 123 Sat Mar 10 08:00:00 CET 2012 Sat Mar 10 08:30:00 CET 2012 0 123 Sat Mar 10 08:30:00 CET 2012 Sat Mar 10 09:00:00 CET 2012 4 211 Thu Mar 08 08:00:00 CET 2012 Thu Mar 08 08:30:00 CET 2012 0 211 Fri Mar 09 08:00:00 CET 2012 Fri Mar 09 08:30:00 CET 2012 1 211 Fri Mar 09 08:30:00 CET 2012 Fri Mar 09 09:00:00 CET 2012 1 211 Fri Mar 09 09:00:00 CET 2012 Fri Mar 09 09:30:00 CET 2012 1 211 Sat Mar 10 08:00:00 CET 2012 Sat Mar 10 08:30:00 CET 2012 0 (Calendar-objekt utan formatering, men sekunddecimalerna är borta.)
F07_JDBC.21 Särskild klass för typkonverteringen Steg 1. Skapa en ny klass Convert_mysql_to_java och flytta metoden converttblsptypes dit. Ändra inget. Första kontrolleras att anropet och bearbetningen fungerar. package db_demo4; import java.sql.resultset; import java.sql.sqlexception; import java.text.simpledateformat; import java.util.date;
public class Convert_mysql_to_java { F07_JDBC.22 //Konvertera värdena från MySQL till rätt datatyper i Java. public void converttblsptypes(resultset rs) throws SQLException { System.out.println("Anropet till converttblsptypes har skett."); short staff_id; Date time_start = null; int jobb_id; System.out.println (">>> Typkonverterade värden:"); SimpleDateFormat dateform = new SimpleDateFormat("yyyy-MM MM-dd HH:mm:ss"); while (rs.next()) //Radvis bearbetning { staff_id = rs.getshort("staff_id"); time_start = rs.gettimestamp("tu_begin"); String time_start_ok = dateform.format(time_start); String time_end_ok = dateform.format( rs.gettimestamp("tu_end") ); jobb_id = rs.getint("job_id"); Date mydate = new java.util.date(time_start.gettime()); System.out.println(staff_id + "\t" + time_start_ok + "\t" + time_end_ok + "\t" + jobb_id+ "\t" + mydate);
F07_JDBC.23 Steg 2. I main-metoden i klassen db_demo skapas ett objekt av den nya klassen Convert_mysql_to_java, och ett anrop görs till dess metod converttblsptypes. package db_demo4; import... public class DB_demo4 { public static void main(string[] args) { try { Class.forName("com.mysql.jdbc.Driver"); ");... //6. Ett object av den nya klassen Convert_mysql_to_java. Convert_mysql_to_java mysqltojava = new Convert_mysql_to_java(); rs.beforefirst(); //Anropa metoden och skcikat som förut med rs-objektet. mysqltojava.converttblsptypes(rs); stmt.close(); conn.close(); catch (Exception e) { System.out.println("ERROR: " + e.getmessage());... Visa DB_demo4
F07_JDBC.24 Steg 3. Ändra metoden converttblsptypes så att den returnerar de typkonverterade raderna till den som anropade. Varje cell på en rad i resultatet från MySQL görs till ett objekt som stoppas in en COLLECTION av typen LIST. Varje sådant LIST-radobjekt stoppas in i en annan LIST som då innehåller hela resultatmängden efter typkonvertering. Oracles tutorial om COLLECTIONS: http://docs.oracle.com/javase/tutorial/collections/index.html Specifikt om LIST: http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html package db_demo4; import java.sql.resultset; import java.sql.sqlexception; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.list;
public class Convert_mysql_to_java1 { F07_JDBC.25 //Konvertera värdena från MySQL till rätt datatyper i Java. //Packa om i ett listobjekt och reutrnera detta. //Med List<Object> går det att blanda olika objekttyper. //(ej tvunget att ange <Object> men slipper varningsmeddelanden). public List<Object> converttblsptypes(resultset rs) throws SQLException { //Variablerna i Java som ska användas för resultatmängdens kolumner. short staff_id; Date time_start = null; int jobb_id; SimpleDateFormat dateform = new SimpleDateFormat("yyyy-MM MM-dd HH:mm:ss"); //Varje cell på raden lagras som ett objekt i denna lista. List<Object> rad = new ArrayList<Object>(); //Varje rad-objekt lagras som ett objekt i denna lista List<Object> tabellensrader = new ArrayList<Object>();
while (rs.next()) //Radvis bearbetning { staff_id = rs.getshort("staff_id"); F07_JDBC.26 time_start = rs.gettimestamp("tu_begin"); String time_start_ok = dateform.format(time_start); String time_end_ok = dateform.format( rs.gettimestamp("tu_end") ); jobb_id = rs.getint("job_id"); //Lägg in radens cellvärden som objekt i rad-listan rad.add(staff_id); rad.add(time_start_ok); rad.add(time_end_ok); rad.add(jobb_id); //Lägg in rad ad-objektet i listan som håller raderna. tabellensrader.add(rad); //Returnera listan som innehåller raderna. return tabellensrader;
F07_JDBC.27 Steg 4. Ändra DB_demo så att den returnerade listan tas emot och innehållet plockas fram.... //6. //Deklarera listan som tar emot resultatmängden efter anropet. List<Object> tabell = new ArrayList<Object>(); //Deklarera objektet av klassen Convert_mysql_to_java1. Convert_mysql_to_java1 mysqltojava = new Convert_mysql_to_java1(); rs.beforefirst(); //Anropa metoden converttblsptypes i objektet mysqltojava som är //av typen/klassen Convert_mysql_to_java1. Skicka med resultaet som //levererades från MySQL. //Tag emot den returnerade listan och lagra den i objektet tabell. tabell = mysqltojava.converttblsptypes(rs);
F07_JDBC.28 //Iterera genom tabell-objektet (som är en lista). //Deklara ett ITERATOR-objekt iter och hämta ett iterator-objekt objekt //speciellt för "tabell". Iterator iter; iter = tabell.iterator(); //Så länge det finns ännu ett objekt i listan... while ( iter.hasnext() ) { //Hämta ut objekt och konvertera samtidigt till typen LIST pga att rad //har deklarerats som LIST. rad = (List)iter.next(); //Skriv ut vart och ett av de fyra objekt på raden. De ligger på //indexen 0, 1, 2, 3. System.out.println(rad.get(0) + " " + rad.get(1) + " " + rad.get(2) + " " + rad.get(3));
System.out.println("\nEtt nett annat sätt att skriva iteration en genom listan:"); F07_JDBC.29 //En iterator specikellt för listor, som ärver vissa egenskaper och metoder //från den generella klassen ITERATOR. for (ListIterator<Object> it = tabell.listiterator(); it.hasnext(); ) { rad = (List)it.next(); System.out.println(rad.get(0) + " " + rad.get(1) + " " + rad.get(2) + " " + rad.get(3)); stmt.close(); conn.close(); Visa DB_demo41