Laboration 24 Databasen MySQL och java



Relevanta dokument
Laboration 13, Arrayer och objekt

Malmö högskola 2008/2009 CTS

Laboration 10 - NetBeans

Lösningar för tenta 3 DAT043,

Malmö högskola 2007/2008 Teknik och samhälle

Laboration 10 - Eclipse

Malmö högskola 2007/2008 Teknik och samhälle

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Laboration 15 Grafiskt användargränssnitt

Malmö högskola 2007/2008 Teknik och samhälle

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

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Objektorienterad programmering i Java

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

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

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Lösningsförslag till tentamen

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

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

Tentamen FYTA11 Javaprogrammering

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

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.

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Malmö högskola 2007/2008 Teknik och samhälle

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

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

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

kl

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Lösningsförslag till tentamen

Mer om grafiska komponenter. Händelsestyrda program

Föreläsning 3: Händelsestyrda program och användargränssnitt

Lösningsförslag tentamen FYTA11 Java

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

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

NetBeans 5.5. Avsikt. Projektfönster

Java-concept och Swing. Swing low, sweet chariot

Laboration A Objektsamlingar

MVC-mönstret. model-view-control i Swing

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Tentamen. Lösningsförslag

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

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

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Lösningsförslag till tentamen

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Lösningsförslag övning 2.

Föreläsning 10. ADT:er och datastrukturer

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Tentamen i Objektorienterad programmering E

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Del A (obligatorisk för alla)

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

Properties. Användbara metoder som kan anropas i propertychanged:

Lösningsförslag till tentamen

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

Tentamen, EDAA20/EDA501 Programmering

Arrayer (fält)

Tentamen OOP

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Laboration 1 - Grunderna för OOP i Java

Lösningsförslag till tentamen FYTA11 Javaprogrammering

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 )

Arrayer. results

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Laboration 4: Digitala bilder

DAT043 Objektorienterad Programmering

Tentamen, EDA501 Programmering M L TM W K V

Föreläsning 3-4 Innehåll

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

FactoryCast HMI. Premium & Quantum PLC. MySQL Server och FactoryCast HMI databastjänst

JAVA Mer om klasser och objektorientering

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

2 b) Följande finns definierat: import java.awt.*; public class Uppgift1b public static void main(string[] mupp) Color färg = Color.blue; Bil[] bilar

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

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

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

DEL 1 För att få godkänt på tentan (betyg 3) måste du lösa minst fem av sju uppgifter i denna del.

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

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

Att bekanta dig med NetBeans programmeringsmiljö och skriva några enkla program med programmeringsspråket Java.

PROGRAMMERING-Java TENTAMINA

Transkript:

Laboration 24 Databasen MySQL och java Avsikten med denna laboration är att du ska hämta information ur en eller flera tabeller och visa resultatet i en JTable-komponent. Du ska ändra innehållet i tabellen och se till att kolumn-bredderna är bra. För att kunna göra detta måste du ha tillgång till en databas och kunna kontakta databasen. På Malmö högskola står en MySQL-server som du kan koppla upp dig från en nätansluten dator. För att detta ska vara möjligt måste du: 1. Hämta en databas-driver från www.mysql.com. 2. Använda samma inloggningsuppgifter som på laboration 23. 1. Hämta databas-driver till MySQL På mysql:s hemsida kan du hämta en driver till en MySQL-databas. Drivern innehåller alla klasser som behövs för att du på ett ganska enkelt sätt ska kunna jobba mot en databas. Adressen till hemsidan är www.mysql.com och du ska sedan klicka på Developer Zone - Downloads - Connectors - Connector/J. Du ska nu vara på sidan http://dev.mysql.com/downloads/connector/j/5.1.html. Hämta hem lämplig arkiv-fil och packa upp den på din dator. Filen mysql-connector-java-5.1.5-bin.jar placerar du t.ex. i C:\java (M:\java på MAH). Sedan måste NetBeans hittar jar-filen. Du ska högerklicka på projektet, välja Properties och sedan klicka på Libraries. Sedan klickar du på knappen Add JAR/Folder och letar upp mysql-...-bin.jar. Markera filen och klicka sedan på OK. 2. Inloggningsuppgifter När du kopplar upp dig mot databasen så måste du ange inloggningsuppgifter. Du använder samma som på laboration 23. Testa databas-drivern Med programmet MysqlDB i F24 kan du testa om du kan koppla upp mot databasen. Om uppkoppliongen går som tänkt så kommer du se innehållet i tabellen Person i databasen test. Testa även att du kan koppla upp mot din egen databas. Uppgift 1 Hämta kolumnnamnen i en resultatmängd När du ska visa resultatet av en databas-sökning är det trevligt att presentera namn på kolumnerna överst. Om du vill använda kolumnnamnen som kommer från databasen så går dessa bra att hämta. Du ska i klassen DBMethods skriva metoden public static String[] getheaders(resultset rs) throws SQLException Följande har du till din hjälp: Du kan erhålla ett objekt av typen ResultSetMetaData med metoden rs.getmetadata(). I ResultSetMetaData-objektet finns följande metoder: * getcolumncount() returnerar antalet kolumner i resultatmängden. Denna uppgift är nödvändig om du ska skapa en String-array med korrekt antal element. * getcolumnlabel(int columnindex) returnerar namnet på kolumnen med angivet index. Kolumnerna numreras från 1 upp till getcolumncount(). Samtliga metoder ovan kan kasta SQLException. Du kan även titta hur utskriften sker i MysqlDB.java. Testa din metod genom att koppla upp mot test-databasen, hämta alla kolumner i person-tabellen och skriv ut kolumn-namnen. Du ska då få en utskrift som innehåller: pnr, namn, alder, langd DA129A, Programmering 1 1

Uppgift 2 Hämta datainnehållet i en resultatmängd Det väsentligaste när man ska visa resultatet av en databassökning är ju naturligtvis att visa den data som sökningen givit. Denna information kan lagras i en två-dimensionell array. Men vilken typ av array ska man välja? Det är ju oftast olika typer av data i resultatmängden. Metoden getobject i objektet ResultSet löser detta problem. Till varje typ av datainnehåll returneras ett objekt, t.ex.. Datatyp INT DECIMAL DOUBLE BOOLEAN DATE STRING Objecttyp Integer BigDecimal Double Boolean Date String Sedan kan man skriva ut dessa på ett snyggt sätt med hjälp av deras tostring-metod. Du ska i klassen DBMethods skriva metoden public static Object[][] getcontent(resultset rs) throws SQLException vilken ska lagra innehållet i resultatmängden i en två-dimensionell array av typen Obejct[ ][ ]. I denna metod kan du använda dig av följande Du kan erhålla ett objekt av typen ResultSetMetaData med metoden rs.getmetadata(). Och sedan ta reda på antalet kolumner på samma sätt som i uppgift 1. Ta reda på antalet rader på följande sätt: Flytta rad-pekaren till sista raden: rs.last(); Lagra sista radnumret i rows: rows = rs.getrow(); Skapa en tvådimensionell array: Object[][] data = new Obejct[rows][cols]; Du kan föra över data från resultatmängden till arrayen i en nästlad loop där du hämtar informationen i en speciell rad och kolumn så här: for(int row = 0; row<rows; row++) { rs.absolute(row + 1); // Flytta till rätt rad i resultatmängden for(int col = 0; col<cols; col++) { data[row][col] = rs.getobject(col + 1); Samtliga metoder ovan kan kasta SQLException. Du kan även titta hur utskriften sker i MysqlDB.java. Testa din metod genom att koppla upp mot test-databasen, hämta alla kolumner i person-tabellen och skriv ut kolumn-namnen. Du ska då få en utskrift som innehåller: 631008-1111, Oskar AL, 41, 182 600807-2222, Eva Ask, 44, 163 620101-3333, Bo Ek, 42, 174 731201-4444, Gudrun Bok, 31, 172 DA129A, Programmering 1 2

Uppgift 3 Visa i tabell, version 1 Nu kan du visa informationen i en JTabel-komponent. Det finns en konstruktor i JTable som ser ut så här: public JTable(Object[][] rowdata, Object[] columnnames) Den passar perfekt för att visa en av våra tabeller. Men man måste placera JTable-komponenten i en JScrollPane för att tabellhuvudet ska synas. private JTable table; private JScrollPane scrollpane; : Container c = getcontentpane(); this.setdefaultcloseoperation(jframe.exit_on_close); this.setsize(400,300); try { MysqlDB.kopplaUpp(); ResultSet rs = MysqlDB.statement.executeQuery("SELECT * FROM Person"); String[] headers = DBMethods.getHeaders(rs); Object[][] content = DBMethods.getContent(rs); table = new JTable(content, headers); scrollpane = new JScrollPane(table); c.add(scrollpane, BorderLayout.CENTER); catch(sqlexception e) { setvisible(true); Testa genom att placera en tabell i ett fönster. Uppgift 4 Sätta kolumnbredder i tabell Ett problem med tabellen är att alla kolumner får samma bredd. Och detta är oftast inte önskavärt. Det går bra att sätta bredden på kolumner i en tabell. Man gör så här: För varje tabell finns objektet TableColumnModel. Med hjälp av detta objekt kan man bl.a. ange bredden på kolumnerna. Tabellens TableColumnModel-objekt erhåller man genom anrop till getcolumnmodel: TableColumnModel columnmodel = table.getcolumnmodel(); Sedan kan man sätta bredden på önskad kolumn genom anropet columnmodel.getcolumn(index).setpreferredwidth(bredd); Naturligtvis måste index vara i intervallet [1, antalkolumneritabellen]. Kolumnbredden är relativ om man inte anger något annat. Med detta menas att hela tabellens bredd fylls ut och kolumnbredderna anpassas till utrymmet. Vill man ange absoluta kolumnbredder måste man ändra tabellens beteende med anropet table.setautoresizemode(jtable.auto_resize_off); Du ska i klassen DBMethods skriva metoden public static void setcolumnwidth(jtable table, int[] colwidth) vilken tar en JTable-komponent och en int-array som input och som använder värdena i int-arrayen för att sätta kolumnbredderna i tabellen. Första elementet i colwidth ger bredden på första kolumnen osv. När du skriver metoden är det bäst att kontrollera att antalet element i colwidth = = antalet kolumner i tabellen, annars blir det kanske körfel. DA129A, Programmering 1 3

Uppgift 5 Avläsa markerade rader i tabellen När en tabell visar sig så kan användaren markera en eller flera rader i tabellen. Om du vill ta reda på vilka rader som är markerade i en tabell kan du anropa metoden getselectedrows i tabellen: int[] valdarader = table.getselectedrows(); Efter anropet innehåller valdarader numret på de rader som var markerade när anropet gjordes. Radnumreringen börjar med 0 och detta passar bra om man ska hämta information ur tabellen med metoden getvalueat(int rad, int kol). Värdet i rad 1, kolumn 1 hämtas med anropet Object data = table.getvalueat(0, 0); Utöka programmet i uppgift 3 med en knapp. När användaren klickar på knappen ska numret på markerade rader i tabellen skrivas ut i output-fönstret. Uppgift 6 Ändra datan i befintlig tabell Tyvärr går det inte att ändra innehållet i en tabell när man använder konstruktorn i Uppgift 3. För att detta ska gå bra måste man använda konstruktorn public JTable(TableModel tm) TableModel-objektet som levereras vid konstruktionen måste implementera gränssnittet TableModel. En klass som gör detta skulle vi kunna konstruera (9 metoder att implementera korrekt). Men det finns en färdig klass i java som tillfredsställer våra behov, nämligen DefaultTableModel (i paketet javax.swing.table). Denna klass innehåller bl.a. konstruktorn: public DefaultTableModel(Object[][] data, Object[] columnnames) Den innehåller också en metod för att ändra befintliga data. Ändrar vi tabelldata med denna metod så ändras tabellinnehållet automatiskt: public void setdatavector(object[][] datavector, Object[] columnidentifiers) Nu ska du modifiera programmet i uppgift 3 så att ett objekt av typen DefaultTableModel används för att ge tabellen innehåll. private JTable table; private JScrollPane scrollpane; private DefaultTableModel tablemodel : Container c = getcontentpane(); String[] headers = DBMethods.getHeaders(rs); Object[][] content = DBMethods.getContent(rs); tablemodel = new DefaultTableModel(content, headers); table = new JTable(tableModel); scrollpane = new JScrollPane(table); c.add(scrollpane, BorderLayout.CENTER); Passa på att skriva metoden settablecontent i fönsterklassen: public void settablecontent(object[][] content, Object[] headers) { tablemodel.setdatavector(content, headers); Lägg in en knapp i fönsterklassen som vid klick 1. Hämtar en ny resultatmängd från databasen, t.ex. innehållet i Telefon. 2. Hämtar resultatmängdens kolumnnamn till en String-array 3. Hämtar resultatmängdens data till en Object[ ][ ]. 4. Anropar metoden settablecontent (se ovan). 5. Anropar metoden DBMethods.setColumnWidth för att ge kolumnerna vettiga bredder. DA129A, Programmering 1 4

DBMethods.java import java.sql.*; import javax.swing.*; import javax.swing.table.*; public class DBMethods { public static String[] getheaders(resultset rs) throws SQLException { ResultSetMetaData meta; String[] headers; meta = rs.getmetadata(); headers = new String[meta.getColumnCount()]; for(int i=0; i<headers.length; i++) { headers[i] = meta.getcolumnlabel(i+1); return headers; public static Object[][] getcontent(resultset rs) throws SQLException { ResultSetMetaData rsmt; Object[][] content; int rows, cols; rsmt = rs.getmetadata(); rs.last(); rows = rs.getrow(); cols = rsmt.getcolumncount(); content = new Object[rows][cols]; for(int row = 0; row<rows; row++) { rs.absolute(row + 1); // Flytta till rätt rad i resultatmängden for(int col = 0; col<cols; col++) { content [row][col] = rs.getobject(col + 1); return content; public static void setcolumnwidth(jtable table, int[] colwidth) { TableColumnModel columnmodel = table.getcolumnmodel(); int count = Math.min(table.getColumnCount(),colWidth.length); for(int i=0; i<count; i++) { columnmodel.getcolumn(i).setpreferredwidth(colwidth[i]); DA129A, Programmering 1 5

Uppgift 3 + Uppgift 5 + Uppgift 6 import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.sql.*; public class Uppgift3 extends JFrame { private JTable table; private JScrollPane scrollpane; private DefaultTableModel tablemodel; // Uppg 6 public Uppgift3() { Container c = getcontentpane(); JButton bytdata = new JButton("Byt data"); JButton valdarader = new JButton("Valda rader"); this.setdefaultcloseoperation(jframe.exit_on_close); this.setsize(400,300); try { MysqlDB.kopplaUpp(); ResultSet rs = MysqlDB.statement.executeQuery("SELECT * FROM Person"); String[] headers = DBMethods.getHeaders(rs); Object[][] content = DBMethods.getContent(rs); // tablemodel = new DefaultTableModel(content, headers); // Uppg 6 // table = new JTable(tableModel); // Uppg 6 table = new JTable(content, headers); // Uppg 3 // valdarader.addactionlistener(new VL()); // Uppg 5 // bytdata.addactionlistener(new AL()); // Uppg 6 scrollpane = new JScrollPane(table); c.add(scrollpane, BorderLayout.CENTER); c.add(valdarader, BorderLayout.NORTH); c.add(bytdata, BorderLayout.SOUTH); catch(sqlexception e) { System.out.println(e); DBMethods.setColumnWidth(table, new int[]{120,120,40,40); // Relativa bredder setvisible(true); public void settablecontent(object[][] content, Object[] headers) { tablemodel.setdatavector(content, headers); // Uppg 5 private class VL implements ActionListener { public void actionperformed(actionevent e) { int[] selectedrows = table.getselectedrows(); String res=""; for(int i=0; i<selectedrows.length; i++) { res += ""+selectedrows[i]+". "+table.getvalueat(selectedrows[i],0)+"\n"; System.out.println(res); // Uppg 6 private class AL implements ActionListener { public void actionperformed(actionevent e) { try { ResultSet rs = MysqlDB.statement.executeQuery("SELECT * FROM Telefon"); tablemodel.setdatavector(dbmethods.getcontent(rs), DBMethods.getHeaders(rs)); catch (SQLException e1) { public static void main(string[] args) { new Uppgift3(); DA129A, Programmering 1 6