Laboration 5 - Biblioteksapplikation Du ska skapa en applikation för att söka efter böcker i en databas. Grunduppgiften som är obligatorisk ger 3 poäng och extrauppgiften ger 3 poäng. Grunduppgift (3 poäng) Skapa en applikation för att möjliggöra sökning av böcker i en centraliserad biblioteksdatabas. Applikationen använder bokdatabasen för att hämta information med hjälp av JDBC - Java Database Connectivity. Denna information skall sedan behandlas på lämpligt sätt av applikationen som också skall presentera informationen för användaren via ett grafiskt användargränssnitt. En användare av applikationen skall kunna: Söka efter böcker med avseende på: o Titel o Författare o ISBN o Ämnesområde o Utgivare o Utgivningsår Krav på applikationen: Vid sökning efter böcker skall det vara möjligt att ange delsträngar. Ex: Om sökning sker på titeln 'Lin' ska man få upp alla böcker i vars titlar denna bokstavsföljd förekommer. Detsamma gäller för alla kategorier det går att söka på. Användargränssnittet skall konstrueras m h a Javas AWT-paket. Innan ni påbörjar implementationen är det en god idé att rita, t ex på vanligt papper, hur ni tänker er att användargränssnittet skall se ut. Applikationen skall delas upp relevanta klasser. Speciellt ska du tänka på att skilja på det grafiska användargränssnittet och kommunikationen med databasen. Relevanta metoder för kommunikationen med databasen skall deklareras i ett javagränssnitt, ett s.k. interface. I övrigt har du frihet att göra en klassuppdelning du finner lämplig. Konstruera en inloggnings- och utloggningsdialog för användaren. Innan användaren får använda applikationen för sökning i databasen skall hon/han ange användarnamn och lösenord. Försök till uppkoppling mot databasen sker med det av användaren angivna användarnamnet och lösenordet. Felaktig inloggning skall ge ett relevant meddelande. Det enda giltiga användarnamnet och lösenordet för inloggning finns nedan. Då användaren valt att logga ut måste denna återigen logga in med det giltiga användarnamnet och lösenordet för att få tillgång till databasen via applikationen.
Tips: Börja redan innan du implementerar skissa på ett klassdiagram som beskriver hur klasserna hänger ihop. Ett klassdiagram ska ändå bifogas i dokumentationen, se nedan. För klassdiagrammet ska UML-notation användas, ni får använda valfritt verktyg för detta, det finns ett flertal som är gratis. (Förutom den UML-notation som finns i boken finns också UML-notationen för klassdiagram beskriven i ett kompendium i PUMA-kursen, se http://www.cs.kau.se/cs/education/courses/dava02/ ) Anmärkning: Då man skall exekvera en SQL-fråga i databasen måste man givetvis ha en uppkoppling mot denna. Efter att man fått resultatmängden och behandlat den skall uppkopplingen till databasen stängas, detta för att minska belastningen på databasen. Varje förfrågan till databasen skall därför innebära: 1. Uppkoppling 2. Förfrågan (behandla resultat o s v) 3. Nedkoppling Detta innebär att användarnamn och lösenord måste sparas undan för en inloggad användare. Endast om användaren har loggat av och återigen vill få tillgång till databasen via applikationen måste användarnamnet och lösenordet anges igen. Extrauppgift Reservera böcker och möjliggör inloggning för flera användare (3 poäng) Inloggning/Utloggning Konstruera inloggnings- och utloggningsmöjligheter för flera olika användare. Mot själva databasen finns fortfarande bara ett möjligt användarnamn och lösenord men detta ska inte längre användas för användarinloggning. Istället ska du lagra giltiga användarnamn och lösenord i en fil lokalt, tillsammans med applikationen. Då användaren loggar in ska hans/hennes användarnamn och lösenord stämmas av mot de giltiga par som finns lagrade i filen. Är användarnamnet och lösenordet korrekt ger du användaren tillgång till applikationen och kopplar upp mot databasen med det mot databasen enda giltiga användarnamnet och lösenordet. Då användaren loggat av ska en ny (eller samma) användare kunna logga in igen. För att kunna konfigurera giltiga användarnamn/lösenord räcker det med att man går in i filen och skriver in/tar bort poster. Reservera böcker Ge användaren möjligheter att reservera böcker samt kontrollera om en bok är reserverad eller inte. Reservationen av böcker skall ske på så sätt att användaren väljer en eller flera böcker av sökträffarna och trycker på en reservera-knapp, den/de valda boken/böckerna skall loggas i en fil (givetvis inte samma fil som innehåller användarnamn/lösenord) tillsammans med namnet på låntagaren. Alla låntagare skall loggas i samma fil med sina respektive reserverade böcker. För böckerna skall endast titel, författare och ISBN loggas. När användaren får sökträffar skall han/hon kunna markera en bok och sedan "trycka på en knapp" för att undersöka om boken är reserverad eller inte. Ett relevant meddelande skall ges. En bok som redan är reserverad ska givetvis inte kunna reserveras av någon annan. En användare ska också ha möjligheten att ta bort de reservationer hon/han önskar.
Tips: Börja konstruktionen av laborationen med att tänka utifrån användarens perspektiv. Med andra ord, hur skall gränssnittet se ut? Vilka funktioner behövs och hur ska de göras åtkomliga? Hur skall informationen presenteras? Hur skall det gå till vid sökning? Ta fram idégeneratorn! En god idé är att dela upp applikationen (i grunduppgiften) i minst tre klasser, en klass som handhar det grafiska gränssnittet, en klass som handhar kommunikationen med databasen och ytterligare en klass som integrerar dessa. Ta hjälp av boken, dina kollegor och er laborationshandledare/lärare.
Att kommunicera med databasen Det rekommenderas starkt att du följer instruktionerna i detta avsnitt och omedelbart, innan du påbörjar själva designarbetet, sätter ihop ett litet testprogram för att kommunicera med databasen. På så sätt får du på en gång klart för dig hur kommunikationen med databasen går till. Dessutom är det roligt! Det går knappast att klassificera som arbete. Databasen innehåller tre tabeller, books, publishers och subjects. Fälten i respektive tabell visas nedan. I varje tabell finns en primär nyckel (id). Alla fält utom id i varje tabell är strängar. books id title isbn subject authors publishers year publishers id text subjects id text Driver för kommunikation med databasen För att koppla upp er mot databasen måste ni först registrera en lämplig driver som gör det möjligt att kommunicera med databasen. Uppkopplingen görs med hjälp av DriverManagerklassen i Javas API. DriverManager.registerDriver(new org.gjt.mm.mysql.driver()); Sql-drivern man skapar ett objekt av ovan är mjukvara finns tillgänglig på hemsidan att ladda ner som en jar-fil (mysql.jar). När ni kompilerar och exekverar, sätt växeln classpath att hänvisa till jar-filen. Kompilering: javac classpath <sökväg till jar-fil>;. [Java-fil] Körning java classpath <sökväg till jar-fil>;. [Class-fil] (Det enklaste är att lägga jar-filen i samma katalog där du har övriga Java-filer för applikationen, att kompilera ser då ut såhär): javac classpath mysql.jar;. [Java-fil] Uppkoppling När ni ska koppla upp er mot databasen använder ni också DriverManager-klassen. Ni måste ange url, användarnamn och lösenord. Url: jdbc:mysql://enterprise.cse.kau.se/dvlib
Användarnamn: java02 Lösenord: dava06 Connection conn = DriverManager.getConnection(Url, Användarnamn, Lösenord); Söka i databasen Det enklaste sättet att kunna ange olika söksträngar är att använda ett objekt av klassen PreparedStatement som finns i Javas API. Med ett PreparedStatement-objekt skapar man i förväg ett uttryck som kan innehålla en okänd parameter. Sedan byter man ut parametern mot aktuell söksträng och exekverar uttrycket, det vill säga skickar sql-frågan till databasen. Först skapar man ett uttryck (PreparedStatement) som man låter innehålla sql-uttrycket. PreparedStatement prep; prep = conn.preparestatement(sql -uttryck); Sedan ersätter man?-tecknet i sql-uttrycket mot aktuell söksträng. prep.setstring(1, söksträng); 1:an anger att det är första förekomsten av?-tecknet som ska ersättas, man kan ha flera?- tecken i en sql-sats. I våra finns dock bara ett?-tecken Vi har nu förberett vårt uttryck och kan nu exekvera vår fråga prep.executequery(); Resultatet från en sådan fråga är ett ResultSet-objekt och vad det innehåller beror på hur sqluttrycket ser ut. Om sql-uttrycken nedan används kommer varje rad i resultatet att innehålla följande kolumner (alla som det inte anges annat på hör till tabellen books): Nr Kolumn 1 Title 2 Isbn 3 subjects.text 4 Authors 5 publishers.text 6 Year Värdena för varje kolumn kan sedan utläsas med hjälp av nr eller titel på kolumen. SQL-uttryck - Dessa är färdiga att använda, du behöver alltså inte ha någon speciell kunskap om databaser för att kunna använda databasen för att göra applikationen. Hämta böcker vid sök på TITEL publishers.id and books.title like?"
Hämta böcker vid sök på FÖRFATTARE publishers.id and books.authors like?" Hämta böcker vid sök på ISBN publishers.id and books.isbn like?" Hämta böcker vid sök på UTGIVARE publishers.id and publishers.text like?" Hämta böcker vid sök på OMRÅDE publishers.id and subjects.text like?" Hämta böcker vid sök på ÅRTAL publishers.id and books.year like?" Anmärkning: I databasen används like tillsammans med wildcard-tecknet % för att kunna matcha delsträngar. Dokumentation För varje klass ska följande dokumenteras, som kommentarer, i källkodsfilen. Kommentarerna ska skrivas på så sätt att man kan använda verktyget javadoc för att generera en separat dokumentation i html-format. Överst i varje fil, nedanför eventuella "import"-satser, ska följande anges: En beskrivning av vad klassen representerar. Beskrivningen ska vara fristående från systemet som helhet, d v s man ska exempelvis inte i beskrivningen för klassen Person tala om att klassen representerar en person som deltar i en auktion. Istället ska man skriva att den representerar en mycket enkel modell av en person. Anledningen till detta är att vi vill göra våra klasser återanvändbara. En klass ska vara så löst kopplad som möjligt gentemot andra klasser. Versionsnumret Författarens namn För varje metod ska följande anges: Kontrakt, d v s för- och eftervillkor. Metodnamn, returtyp, namn och typer på parametrar, dessa framgår automatiskt av metodens signatur.
En kompletterande beskrivning av metoden och/eller dess parametrar om det behövs utifrån vad som redan ges av kontraktet och metodens signatur. Tänk på att inte införa redundans, man ska inte upprepa samma sak flera gånger. Jämför ovanstående med avsnitt 5.10 och speciellt 5.10.2 i kursboken. Då du är färdig med din applikation ska du också generera dokumentation i htmlformat med verktyget javadoc. javadoc kan användas direkt i terminalfönstret precis som java och javac. Hitta ett bra sätt att skriva kontrakten på så de framgår tydligt i dokumentationen som genererats med javadoc. Rita ett klassdiagram Ett klassdiagram som beskriver hur klasserna hänger ihop skall bifogas. För klassdiagrammet ska UML-notation användas, ni får använda valfritt verktyg för detta, det finns ett flertal som är gratis. Inlämning Laborationen skall provköras (går att skicka in zippat via mail). Javadoc skickas in via mail (också zippat, och se till att de dokument som genererats med javadoc finns i en egen mapp då arkivet extraheras). Alternativt hänvisas till en länk. Dokumentationen (enligt ovanstående dokumentationskrav) skall lämnas i handledarens fack. Markera tydligt om du gjort extrapoängen.