Skip to main content
Dat 2. semester
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Opgave i JDBC og mappere (bibliotek)

Bibliotekssystem i Java og Postgres

Her er et ER-diagram, som cirka repræsenterer tabellerne på 3NF fra normaliseringartiklen:

ER-diagram

I sidste uge, oprettede vi en database for biblioteket i Postgres via pgAdmin. Hvis du ikke har en library-database, så lav den nu og hent dette script for at få oprettet tabeller med data.

Dagens opgave

I dag skal vi koble vores Postgres database sammen med vores Javalinserver.

  1. Klon projektet WebserverE26 eller opdater det, hvis du allerede har det. Stil dig i branchen “mappers”.

  2. Kig i pom.xml. Der er kommet en ny dependency som definerer en dependency til postgres. Du finder den også i Toolbox når du selv skal bruge den i dit eget projekt.

  3. Bemærk mappen persistence. Her lægger vi klasser, der arbejder med databasen. Det er de såkaldte mappere. Vi bruger her det design pattern, som hedder Data Mapper.

  4. Kig på klassen ``

  5. Så skal vi lave klasser, der kan hente data fra databasen og lave dem til Javaobjekter. , så vi laver en mapperklasse i vores persistencepakke. Start med en BorrowerMapper. Lav den uden at give den nogen metoder endnu.

  6. Vi ønsker ikke, at vores mapper er hardcodet til at forbinde sig til en specifik database. Vi ønsker at bruge dependency injection. Derfor vil vi også gerne have en klasse DatabaseConnector, som tager sig af forbindelsen til den specifikke database. Find koden til at lave en DatabaseConnector i Toolbox. Læg din DatabaseConnector i pakken persistence. Kig koden igennem og vær sikker på, at du forstår hvad der sker.

    Koden kompilerer ikke, for klassen gør brug af en hjemmelavet exception kaldet DatabaseException. Den skal vi også have lavet. Da vi gerne vil strukturere koden fornuftigt, skal du nu lave en pakke kaldet exceptions, hvor du kan lægge dine hjemmelavede exceptions. Du kan nu skrive din egen DatabaseException eller kopiere koden fra Toolbox.

  7. Nu har vi en klasse, der kan forbinde til en database. Den klasse vil vi gerne gøre brug af i vores mapper BorrowMapper. Så vi giver BorrowMapper en attribut DatabaseConnector connector og lader den tage en instans af DatabaseConnector som argument til sin konstruktør. Du kan finde inspiration til koden i Toolbox

  8. Vi har det nødvendige for at kunne begynde at hente data fra databasen. Vi starter med at lave en metode, som kan håndtere query 1. Find en låner ud fra et specifikt laaner_id.

    Lav metoden public Borrower getBorrowerById(int id) i din BorrowerMapper-klasse. Metoden skal tage et id som argument og returnere et Borrower-objekt med data fra databasen. Find inspiration til koden i Toolbox.

  9. Det er tid til at teste vores kode. I main skal vi have oprettet et DatabaseConnector-objekt og et BorrowerMapper-objekt. DatabaseConnector-objektet skal oprettes med url, user, og password, der passer til den database vi vil bruge. Objektet skal gives til BorrowerMapper som argument til konstruktøren (dependency injection).

    Test i din main, at du kan kalde metoden getBorrowerById(int id) og få et objekt tilbage, som er populeret med data fra databasen. Du kan finde inspiration til koden i Toolbox

  10. Lav nu mapper-metoder til de andre queries vi lavede i pgAdmin. Her skal du være opmærksom på at

  • du har muligvis brug for flere mappere (fx BookMapper og AuthorMapper).
  • du har brug for at lave joins, hvis du vil medtage både postnummer og by, når du opretter Borrower-objekter.
  • du ikke skal sende fx et laaner_id med når du laver INSERT, da postgres selv generer nøglen. Hvis du gerne vil have id tilbage efter INSERT, skal du bruge Statement.RETURN_GENERATED_KEYS. Du kan finde inspiration til koden i Toolbox
  1. Prøv at lave mapper-metoder, som returnerer data, der ikke er entiteter. Fx kan du lave en metode, der returnerer en låner og en liste af de forfattere vedkommende har lånt bøger af. Lav en Data Transfer Object klasse, som kan bruges til de data. Læg klassen i en pakke kaldet dto.

Her kan du finde forslag til løsninger.