Opgave i JDBC og mappere (bibliotek)
Her er et ER-diagram, som cirka repræsenterer tabellerne på 3NF fra normaliseringartiklen:

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.
I dag skal vi koble vores Postgres database sammen med vores Javalinserver.
Klon projektet WebserverE26 eller opdater det, hvis du allerede har det. Stil dig i branchen “mappers”.
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.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.
Kig på klassen ``
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.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
DatabaseConnectori Toolbox. Læg dinDatabaseConnectori 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 egenDatabaseExceptioneller kopiere koden fra Toolbox.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 giverBorrowMapperen attributDatabaseConnector connectorog lader den tage en instans afDatabaseConnectorsom argument til sin konstruktør. Du kan finde inspiration til koden i ToolboxVi 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 dinBorrowerMapper-klasse. Metoden skal tage et id som argument og returnere etBorrower-objekt med data fra databasen. Find inspiration til koden i Toolbox.Det er tid til at teste vores kode. I main skal vi have oprettet et
DatabaseConnector-objekt og etBorrowerMapper-objekt.DatabaseConnector-objektet skal oprettes med url, user, og password, der passer til den database vi vil bruge. Objektet skal gives tilBorrowerMappersom 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 ToolboxLav 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
BookMapperogAuthorMapper). - 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
- 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.