FÖ 07 - JDBC Åtkomst till databaser från applikationer med Java - exempelkod -



Relevanta dokument
Klientprogrammering mot databaser

INTRODUKTION TILL JDBC

Laboration 24 Databasen MySQL och java

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Innehåll. Föreläsning 3. javax.naming.context. javax.sql.datasource. Vad är JDBC? Java Naming and Directory Interface(JNDI) Viktigaste metoder:

Lösningsförslag, tentamen i Databaser

2I1070 Lektion 2 Servlets och databaskopplingar Internetprogrammering 2I1049 Treskiktsarkitektur Klient-server med servlets

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Classpath. Class loading + resurser. Class loader. jar-filer

Skapa exempeldatabasen

Att skriva till och läsa från terminalfönstret

Sample exam questions. Database exam TIG058

ADO.NET Murach Kapitel 17-20

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Typkonvertering. Java versus C

Högskolan Dalarna sid 1 av 5 DI-institutionen Hans-Edy Mårtensson Sten Sundin

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tentamen OOP

Genomgång av tentamen. Databasteknik ITHS 4/3 2016

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Objektorienterad programmering i Java

Laboration A Objektsamlingar

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Generisk klass med typparameter Inre klass - ListIterator

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Föreläsning 3-4 Innehåll

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

JAVA Mer om klasser och objektorientering

Föreläsning 2. Länkad lista och iterator

Objektsamlingar i Java

Föreläsning 2. Länkad lista och iterator

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

TDDC77 Objektorienterad Programmering

Instuderingsfrågor, del D

F4. programmeringsteknik och Matlab

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Att använda Java SE JDK 6

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsnings 9 - Exceptions, I/O

Tentamen ID1004 Objektorienterad programmering December 15, 2012

PROGRAMMERING-Java Omtentamina

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 6: Metoder och fält (arrays)

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Stored procedure i ASP.NET

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TENTAMEN OOP

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Kopiering av objekt i Java

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Malmö högskola 2008/2009 CTS

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

TENTAMEN OOP

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

FÖRSLAG TILL LÖSNINGAR, TENTAMEN I IKB007 INTERNETPROGRAMMERING MED JAVA, 5p för SY2, , kl

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Arrayer. results

LÖSNINGSFÖRSLAG TILL TENTAMEN PROGRAMMERINGSMETODIK MOM2 - JAVA, 4P.

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

DAT043 - föreläsning 8

4.4 Swing ett interaktivt grafiskt gränssnitt

Lektion 5 HTML, CSS, PHP och MySQL

Föreläsning 2, vecka 8: Repetition

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

DB2-åtkomst från WebSphere

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Parallellism, återblick

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Transkript:

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