IN2090-ukesoppgaver: Uke 11
Programmering med SQL
Du velger selv om du vil l?se oppgavene med Python (3) eller Java. Oppgavene denne uken uvider koden skrevet som del av denne ukens videoer, og koden er tilgjengelig fra timeplanen i enkle filer, eller kan lastes ned som en Zip-fil som inneholder SQL-scriptene, Python-koden, Java-koden og Javas avhengigheter.
Merk: Koden kobler seg til din personlige database p? IFI, s? i likhet med tilkobling til databasene via psql
m? man enten fjerninnlogge til en IFI-maskin, v?re p? IFIs WIFI eller sitte p? en IFI-maskin for ? kunne kj?re koden.
Om du fjerninnlogger kan koden lastes ned i bash
slik:
wget /studier/emner/matnat/ifi/IN2090/h21/undervisningsmateriale/webshop.zip
unzip webshop.zip
cd webshop
For ? f? dataene inn i din personlige database, kj?r de to SQL-scriptene webshop.sql
og data.sql
som ligger i Zip-filen. Disse kan kj?res ved ? logge inn i din personlige database fra mappen med SQL-filene, og kj?re f?lgende fra psql
:
\i webshop.sql
\i data.sql
Python
Dersom du velger Python m? programmene du skriver kj?res med Python 3. Dette gj?res p? f?lgende m?te:
python3 user_frontend.py
For Python kan det v?re (om du f?r en feilmelding om at psycopg2
ikke finnes) du ogs? m? installere biblioteket psycopg2
, som gj?res ved ? kj?re:
pip3 install --user psycopg2-binary
Java
Dersom du velger ? l?se oppgaven med Java kan det v?re (om du f?r en ClassDefNotFoundError
) at du m? ha med filen postgresql.jar
n?r du kj?rer programmet. Filen ligger i webshop/java
-mappen i Zip-filen som man kan laste ned over. Du kj?rer s? Java programmet (etter vanlig kompilering med javac
) slik i Linux/Mac:
java -cp ".:postgresql.jar" UserFrontend
og slik i Windows:
java -cp ".;postgresql.jar" UserFrontend
Oppgave 1 – Forbedret s?k
I denne oppgaven skal du forbedre s?ket etter produkter. Brukeren skal kunne sortere resultatene, og skal kunne velge om sorteringen skal skje p? pris eller p? produktnavn, i tillegg skal brukeren kunne velge om sorteringen skal skje fra minst til st?rst eller st?rst til minst. Til slutt skal brukeren kunne velge en begrensning p? hvor mange produkter som skal vises. Merk at om brukeren ikke oppgir noe p? sp?rsm?lene, skal ingen sortering/begrensning skje. Et s?k skal da kunne se slik ut:
-- USER FRONTEND --
Please choose an option:
1. Register
2. Login
3. Exit
Option: 2
-- LOGIN --
Username: perh
Password: per123
Welcome Per Hansen
-- SEARCH --
Search:
Category: games
How should the results be sorted?
1. by price
2. by name
Sorting: 1
Sort according to:
1. Ascending order
2. Descending order
Ordering: 1
Limit: 2
-- RESULTS --
=== Realm of Battle Skill ===
Product ID: 13
Price: 19.95
Category: games
Description: An MMORPG
=== Star Fights 3 ===
Product ID: 2
Price: 15.39
Category: games
Description: A space simulator
Tips: Merk at man m? n? holde styr p? hvilke “placeholdere” man har lagt til i sp?rringen og ikke (avhengig av brukerens input). I Python kan det derfor v?re lurt ? bruke navngitte “placeholders” som beskrevet i ukens videoer. For Java blir dette litt mer komplisert, siden Javas JDBC ikke st?tter navngitte parametre. Her kan man derimot bruke en teller (f.eks. int count=0
) og s? ?ke denne for hver “placeholder” man substituerer inne en verdi for. F.eks.~som i koden her:
String q = "SELECT * FROM ws.products WHERE name LIKE ?";
if (min_price != null)
" AND price <= ?";
q += if (max_price != null)
" AND price >= ?";
q += ";";
q +=
prepareStatement(q);
PrepareStatement stmt = connection.setString(1, name);
stmt.int count = 2;
if (min_price != null)
setFloat(count++, min_price);
stmt.if (max_price != null)
setFloat(count++, max_price); stmt.
Oppgave 2 – Bestilling av produkter
I denne oppgaven skal du implementere order_products(conn, username)
(Python) eller orderProducts(Connection connection, String username)
(Java). Denne metoden blir kalt etter at en bruker har s?kt etter produkter. Denne metoden skal sp?rre brukeren om hvilket produkt brukeren ?nsker ? bestille basert p? pid
(produktets ID), og deretter hvor mange av dette produktet som skal bestilles. S? skal metoden kj?re en INSERT
-kommando som setter bestillingen inn i ws.orders
-tabellen.
Merk at man vet brukernavnet til brukeren som skal bestille produketet, men i ws.orders
skal man legge in brukerens uid
.
En bestilling kan se slik ut (og er en forsettelse av s?ket vist over), hvor brukeren bestiller 5 eksemplarer av spillet med pid
lik 2, alts? Star Fights 3
:
[...]
-- RESULTS --
=== Realm of Battle Skill ===
Product ID: 13
Price: 19.95
Category: games
Description: An MMORPG
=== Star Fights 3 ===
Product ID: 2
Price: 15.39
Category: games
Description: A space simulator
Order (Product ID): 2
How many: 5
Product(s) ordered.