Det er lidt en rodet omgang du har skrevet men vil forsøge at svare på spørgsmålene i den rækkefølge du har skrevet dine spørgsmål. Synes dog stadig du bør gøre mere ud af dine spørgsmål men hva faen jeg kedede mig.
Det jeg forstår end til videre er
Connection er forbindelse til databasen
Statement er en SQL sætning
ResultSet er en pege-bind
Korrekt forstået. For hvert SQL udtryk du ønsker at køre på databasen opretter du et Statement objekt. Det skal dog siges at i dit kodeeksempel er det ikke ligefrem sikker kode da det kan misbruges til SQL injections (du kan via brugerinput ændre på hvad SQL udtrykket rent faktisk gør. Fx kan man slette hele databasen).
Jeg håber du selv er klar over hvad et page-bind er. Ellers er det nærmere et udtryk for et objekt der indeholder resultatet af dit SQL kald hvor du løbende kan hente resultater ud fra (hvis der er mere end en række).
(public Gaest opretGaest(String navn, String adresse, String tlf,
String email)) Denne metode opretter en gæst, men er ikke med det der sker her fra
(
} catch (SQLException ex) {
System.out
.println("Der er opstået en fejl ved forsøg at finde gaest ");
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
System.out
.println("Der er opstået en fejl ved forsøg at finde gaest ");
}
}
}
)
Jeg regner med du her mener "catch" og "finally". Dette er exception-handling hvor du kan angive hvad der skal ske hvis koden fejler. Dette bruges især i tilfælde hvor du som udvikler ikke kan garantere at koden virker (fx når du forbinder til en database kan du som udvikler ikke garantere at forbindelsen til databasen kan oprettes).
Du angiver dette ved at pakke den problemfyldte kode ind i en try{ ... } konstruktion som efterfølgende har en catch (...) { ... } blok og sidst med mulighed for en finally { ... }.
Når koden køres vil alt inde i "catch" blokken køres men hvis der sker en exception vil koden stoppe med at fortsætte herinde. Herefter vil Java se efter om der findes en "catch" blok der kan bruges til at samle fejlen op. I dette tilfælde samles der en SQLException op (eller exceptions der nedarver fra SQLException).
Hvis exception'en samles op vil koden inde i catch-blokken køres og her kan du fx skrive en fejlbesked eller forsøge at fikse problemet så programmet fortsat kan køre.
finally-blokken er så noget kode du ønsker der altid skal køres uanset om der kommer en fejl eller ej inde i din catch-blok. Dette bruges ofte til at rydde op i fx åbne databaseforbindelser, filer eller andre ressourcer.
Lig mærke til at i koden opretter du et Statement og dette skal lukkes for at undgå spild af ressourcer mens dit program kører. Derfor er koden i din finally lavet således at hvis din catch fik oprettet et statement men fejlede i at køre dit SQL så vil vi stadig få lukket dit statement.
Åh ja, det kan virke lidt rodet i din kode men årsagen til der er en try-blok omkring "stmt.close()" er fordi dette også kan give en exception. Så hvis dette sker så udskrives der blot en fejlbesked fordi det ikke er muligt at gøre andet.
Det jeg vil vide er hvad er forskellen mellem
import java.util.ArrayList;
import java.util.List;
og igen
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
Altså forskellen er du importerer forskellige klasser ind i din klasse. Når du importerer en klasse så kan du fx skrive "ArrayList" frem for "java.util.ArrayList" og Java vil stadig vide hvad for en "ArrayList" du faktisk mener. Forskellen mellem de to grupper du angiver er det ene er klasser fra pakken java.util mens de andre er java.sql. Java benytter pakker til at opdele formålet med enkelte klasser således du på denne måde kan vide hvad der er relevant for SQL relateret arbejde og hvad der kan bruges som generelle værktøjer (util).
Det er desuden muligt at skrive "java.sql.*" og du vil så importere alle klasser der er en del af "java.sql" pakken. Det er dog ofte ikke nogen god ide uden du ved hvad du laver (i større projekter kan du godt få noget værre rod når du ikke har helt styr på hvilken udgave af en klasse du bruger).
catch (SQLException e)
catch (SQLException ex)
Læs min beskrivelse omkring exception handling. Forskellen på disse to er blot navnet på den variable der repræsenterer din exception. I din kode gør det ingen forskel da du faktisk ikke bruger exception objektet men hvis du ønsker at udskrive detaljeret fejlinformationer er det meget nyttigt at du kan få fat i exception-objektet og kalde fx "ex.printStackTrace()" der udskriver præcist hvor fejlen er opstået og derved gøre det nemmere at debug.
Den først oprette Gæsten og til sidst returnere findGæstVedTlf : hvorfor man den returnere findGæstVedTlf
Det er for at verificere at gæsten faktisk er kommet ind i databasen. Ved at gemme data i databasen og efterfølgende lave en søgning for at få fat i de nye data, garanterer du at det objekt der kommer ud af "opretGaest" vil være det samme som hvis du fremsøgte gæsten med "findGaestVedTlf".
Det kunne også tænkes at databasen er sat til automatisk at generere et ID til din gæst og dette ID vil du først få når du søger efter din gæst efterfølgende. Fordelen ved at lade databasen generere ID'et er at du på denne måde er sikker på alle ID'er er unikke selvom der skulle være flere der opretter gæster på samme tid (med forskellige instanser af dit program).
Anden metode finde Gæst og starte med public List <Gæst> findGæst og returnere gæstList
Hvad der menes med gæst List
Årsagen til der returneres en liste er at metoden kan returnere flere resultater på en given søgning. Fx er koden lavet sådan du kan nøjes med at søge efter navn og hvis der er flere gæster der har samme navn så vil koden kunne returnere alle gæster med samme navn frem for kun at give dig den første gæst.
I Java angives dette med List<Gaest> som betyder du returnerer en liste med Gaest objekter. Fordelen er du senere kan tage objekter ud af listen og Java vil vide der med sikkerhed er tale om Gaest objekter (hvorefter du kan kalde de metoder der findes for Gaest objekter).
Tredje metode give lidt mening fordi den starte med findGæstVedTlf() og slutte med return gæst
Ja sidste metode returnerer kun en gæst. Dette kunne tyde på at databasemodellen kun tillader en gæst at have et givent tlf-nummer hvilket gør at tlf-nummeret er en unik nøgle til en given gæst.