Avatar billede fastpoint Nybegynder
24. april 2005 - 17:53 Der er 20 kommentarer og
1 løsning

Hjælp med gateway pattern

Hvordan skal sådan noget programmeres?
Jeg har programmeret en klasse "Bruger.java" og i min database (oracle 9i) findes der en tabel med "Bruger" med tre felter. BrugerID (tekst) Password (tekst) afdeling (tekst).

men så mangler jeg selve BrugerGateWay.Java klassen. Hvordan skal man lave sådan en? Har forstået det eneste den skal kunne er, at returnere objekter af Bruger.java.
Men hvordan skal det laves? Er det bare en helt normal metode som hiver parametre ned og sender et objekt tilbage udfra hvad den finder i databasen? eller er det noget med prepared statements?

please kode eksempel!

fastpoint
Avatar billede arne_v Ekspert
24. april 2005 - 18:06 #1
En oplagt mulighed var noget som:

public class BrugerGateway {
    public BrugerGateway() {
      ...
    }
    public Bruger findEnBruger(String id) {
      ...
    }
    public ArrayList findAlleBrugere() {
      ...
    }
    public void gemBruger(Bruger o) {
      ...
    }
}
Avatar billede arne_v Ekspert
24. april 2005 - 18:07 #2
Om BrugerGateway bruger almindelige Statement eller PreparedStatement er
en implementations ting (jeg ville altid bruge PreparedStatement).
Avatar billede fastpoint Nybegynder
24. april 2005 - 18:09 #3
Det vil være helt vildt super hvis du kan lave en PreparedStatement ud fra hvad jeg skrev! for public Bruger findEnBruger(String id) {
Avatar billede arne_v Ekspert
24. april 2005 - 18:09 #4
Ovenstående 3 metoder skal så bruge:

SELECT med WHERE

SELECT uden WHERE

UPDATE / INSERT
Avatar billede arne_v Ekspert
24. april 2005 - 18:13 #5
Der ikke noget avanceret i PreparedStatement.

...
PrepareStatement pstmt = con.prepareStatement("SELECT * FROM brugere WHERE id = ?");
pstmt.setString(1, id);
ResultSet rs = pstmt.executeQuery();
...
Avatar billede fastpoint Nybegynder
24. april 2005 - 18:22 #6
okay det er det med ? tegnene, som jeg ikke forstår.
Betyder det her pstmt.setString(1, id); står 1 tallet for spørgsmåltegn 1? og id er parametren som kommer med metoden?
Avatar billede arne_v Ekspert
24. april 2005 - 18:26 #7
1 betyder sæt ind for første ?

id er en variabel med den værdi som skal bruges
Avatar billede fastpoint Nybegynder
24. april 2005 - 18:32 #8
Hvordan ved den hvilken værdi den skal sætte ind istedet for ?'enet

PrepareStatement pstmt = con.prepareStatement("SELECT * FROM brugere WHERE id = ? AND afdeling = ?");

hvordan ved den hvad der skal sættes ind i afdeling og hvad der skal ind i id?
Avatar billede simonvalter Praktikant
24. april 2005 - 18:33 #9
Avatar billede arne_v Ekspert
24. april 2005 - 18:39 #10
pstmt.setString(1, id); // sætter ind i første ?
pstmt.setString(2, afdeling); // sætter ind i anden ?
Avatar billede fastpoint Nybegynder
24. april 2005 - 18:54 #11
nu forstår jeg det:)

Den her metode
public Bruger findEnBruger(String id) {

lyder meget, som det min lærer sagde. "man skal kunde sende et ID og få et objekt tilbage".

hvorfor ser den ikke sådan her ud?

public Bruger findEnBruger(String id, String password) {

ville det ikke være smartest? så kan man lade SQL'en evalurere om der findes en bruger med det ID og kode.

eller skal bare sende et id med og få et objekt tilbage, som man så ved hjælp af java kode ser om passer med det der er blevet indtastet i GUI'en?

fastpoint
Avatar billede arne_v Ekspert
24. april 2005 - 18:58 #12
Fordi din gateways ophave er at hente data op fra databasen og aflevere dem
i et objekt.

Beslutningen om hvad der skal gøres alt efter om password passer eller ej
er ikke dens problem. Det hører hjemme i et andet lag.
Avatar billede fastpoint Nybegynder
24. april 2005 - 19:14 #13
okay så man kun sende ID med som parameter?

Vi skal nemlig også hive nogle varer op fra databasen og der kender vi ikke id'et på den, men navnene. Vi havde tænkt os, at søge med LIKE og det kan man ikke gøre ud fra et id:)

men der laver måske bare sådan en

public ArrayList findAlleVare() {

?

Det var 2. stk spørgsmål:) og et svar fra dig?
Avatar billede arne_v Ekspert
24. april 2005 - 19:19 #14
public ArrayList findVarerEfterNavn(String navn) {
  ...
}

eventuelt med LIKE fremfor =
Avatar billede arne_v Ekspert
24. april 2005 - 19:19 #15
svar
Avatar billede fastpoint Nybegynder
24. april 2005 - 19:54 #16
okay men man må gerne sende flere parametre med? må jeg næsten gå ud fra ellers kan jeg ikke se hvordan man kan udfylde de resterende spørgsmåltegn.

alle mine gateways bliver oprettet af i en klasse. skal denne klasse oprette database forbindelsen eller er det okay, at hver gateway opretter sin egen database forbindelse? den lukker selvfølgelig også efter.
Avatar billede arne_v Ekspert
24. april 2005 - 19:56 #17
du kan sagtens sende flere parametre med
Avatar billede arne_v Ekspert
24. april 2005 - 19:56 #18
normalt vil man med gateway have en klasse per tabel
Avatar billede fastpoint Nybegynder
24. april 2005 - 19:58 #19
Vi har også lavet en gateway per tabel:) men vi har lavet en slags dbkontrol klasse som opretter en instans af hver gateway.

så hvis du bedre kan svare dette nu 

alle mine gateways bliver oprettet af i en klasse. skal denne klasse oprette database forbindelsen eller er det okay, at hver gateway opretter sin egen database forbindelse? den lukker selvfølgelig også efter.

så ville det være super!
Avatar billede arne_v Ekspert
24. april 2005 - 19:58 #20
low volume app:
  hver instans af gateway klassen har en permanent åben connection

high volume app:
  hver metode åbner en connection og lukker igen
  der bruges en connection pool til at minimere performance overhead
Avatar billede arne_v Ekspert
24. april 2005 - 20:01 #21
Du kan enten lave dine gateway klasser som singleton eller oprette en
instans når du skal bruge en.

singleton + permanent åben connection = kræver synchronized på metoderne
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester