Avatar billede fastpoint Nybegynder
25. april 2005 - 07:49 Der er 28 kommentarer og
1 løsning

java og sql

koden er

  try
  {
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  Connection connection = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=c://database.mdb");
  String statement = "SELECT * FROM Bruger WHERE brugerID = ? AND password = ?";
  PreparedStatement nyStatement = null;
  nyStatement = connection.prepareStatement(statement);
  nyStatement.setString(1, brugerID);
  nyStatement.setString(2, password);
  nyStatement.execute();
  }
  catch(Exception as)
  {
   
  }

hvor bliver værdierne gemt? skal jeg gemme nyStatement.execute(); i et resultset?
Avatar billede arne_v Ekspert
25. april 2005 - 08:07 #1
...
ResultSet rs = nyStatement.executeQuery();
int ival rs.getInt(kolmedint);
String sval rs.getString(kolmedstring);
...
Avatar billede fastpoint Nybegynder
25. april 2005 - 22:20 #2
Vi har droppet vores preparedstatement.

Derfor retter vi spørgsmålet til noget andet:)

Vores sql

String query = "SELECT * FROM bruger WHERE bruger = 'brugerID' AND password = 'passwrd'";

Anvender vi så et row gateway pattern?

hvis der stod

String query = "SELECT * FROM bruger ";

ville det være et table gateway pattern?
Avatar billede arne_v Ekspert
25. april 2005 - 22:32 #3
table gateway pattern = en klasse som repræsenterer en hel tabel

row gateway pattern = en klasse som repræsenterer en enkelt række

du kan ikke afgøre hvad det er udfra SELECT statement

det er metoderne og deres argumenter som afgør det
Avatar billede arne_v Ekspert
25. april 2005 - 22:32 #4
PS: Det er ret nemt at bruge PreparedStatement og man slipper for mange problemer
Avatar billede fastpoint Nybegynder
25. april 2005 - 22:40 #5
Dette er altså row gateway pattern?

public void getPerson(String navn)
{

}

Dette er et table gateway pattern?

public void getPersoner(String navn)
{

}

Den første sender et enkelt person objekt tilbage og den anden sender en arraylist med objekter tilbage eller et hashmap?
Avatar billede arne_v Ekspert
25. april 2005 - 22:48 #6
nej faktisk ikke

en table gateway klasse har:
  * find'ere som returnerer et ResultSet (eller DataRow)
  * insert/update med samme antal argumenter som der er felter i tabellen
  * delete med primær nøgle som argument

en row gateway klasse har:
  * get og set for hvert felt i tabellen
  * insert/update/delete uden argumenter
  * static find'ere som returnerer enten en instans eller en ArrayList med
    instanser (*)

*) Fowler har puttet find'erne over i en seperat klasse, men det synes jeg ikke
  er nødvendig
Avatar billede fastpoint Nybegynder
25. april 2005 - 23:10 #7
Er det ikke meningen, at gateway patterns skal returne et eller flere objekter?

* find'ere som returnerer et ResultSet (eller DataRow)

Er ResultSet et objekt? Vi troede hvis vi nu ville hente alle brugere i databasen så skulle vores Gateway returnere en Arraylist med Bruger objekter.

Men man må gerne returnere et ResultSet?
Avatar billede arne_v Ekspert
25. april 2005 - 23:16 #8
Hvis Bruger er en table gateway som vil den have:

public ResultSet findAll() {

Hvis Bruger er en row gateway som vil den have:

public static List findAll() {

(hvor den returnerede ArrayList indeholder Bruger objekter)
Avatar billede arne_v Ekspert
25. april 2005 - 23:16 #9
sådan læser jeg ihvertfald eksemplerne i Fowlers bog
Avatar billede fastpoint Nybegynder
25. april 2005 - 23:25 #10
I vores BrugerGateway har vi lavet denne. Hvis det overhovedet er et pattern?

public Bruger hentBruger(String brugerID, String passwrd)
  {
  try
  {
 
      Class.forName("oracle.jdbc.driver.OracleDriver");
      Connection connection = DriverManager.getConnection(
      Statement statement = connection.createStatement();
      String query = "SELECT * FROM bruger WHERE bruger = 'brugerID' AND password = 'passwrd'";
      ResultSet result = statement.executeQuery(query);

      String brugernavn = result.getString(1);
      String password = result.getString(2);
      String afdeling = result.getString(3);
     
      return new Bruger(brugernavn,password,afdeling); 

  }  catch(Exception ax)
  {
    System.out.println(ax);
  }


Undskyld besværet, men vi har bare fået en meget dårlig introduktion til emnet.
Vi prøver bare på at hente en bruger op fra database.
Avatar billede arne_v Ekspert
25. april 2005 - 23:28 #11
public static Bruger hentBruger(String brugerID, String passwrd)

er en pæn metode en en row gateway
Avatar billede fastpoint Nybegynder
25. april 2005 - 23:30 #12
hvorfor skal de være static? Vi ved godt hvad det betyder, men hvad er grunden til det?
Avatar billede arne_v Ekspert
25. april 2005 - 23:33 #13
Det er jo en metode som producerer en Bruger ikke en metode som
arbejder på Bruger klassens private variable.

Så synes jeg da at det giver mest mening at have den static.

Så kan man også lave:

Bruger b = Bruger.hentBruger(un,pw);

fremfor:

Bruger b1 = new Bruger();
Bruger b2 = b1.hentBruger(un,pw);

hvor b1 er noget overflødig.
Avatar billede fastpoint Nybegynder
25. april 2005 - 23:41 #14
Det er selvfølgelig rigtigt nok!
Alle vores gateways bliver oprettet i én klasse.
Er det forkert? skal Bruger oprettet sin egen gateway?
Vi har en kontrolklasse som opretter både Bruger og den klasse, som opretter alle gateways så der er adgang til begge objekter.

Hvad er mest rigtigt?
Avatar billede arne_v Ekspert
26. april 2005 - 00:00 #15
Både med table gateway og row gateway skal I have en klasse per tabel.
Avatar billede arne_v Ekspert
26. april 2005 - 00:01 #16
Og det er jo netop en af fordelen ved de static find'ere (eller hent'ere som I bruger)
at man ikke behøver et objekt for kunne kalde dem.
Avatar billede fastpoint Nybegynder
26. april 2005 - 00:16 #17
Derfor! Vi har heller ikke på vores designklassediagram angivet hvor gateway klasserne bliver oprettet!

Bruger = BrugerGateway.hentBruger("test","test");

sådan kan vi godt gøre og det er også rigtigt ?

Du skrev

Bruger b = Bruger.hentBruger(un,pw);

men du mente vel BrugerGateway?
Avatar billede arne_v Ekspert
26. april 2005 - 00:40 #18
Næh.

Jeg ville bare putte det hele i samme klasse.
Avatar billede fastpoint Nybegynder
26. april 2005 - 00:45 #19
lidt forvirrende. Du vil da ikke ligge alt ind i Bruger? Hvorfor laver vi så en BrugerGateway?
Avatar billede arne_v Ekspert
26. april 2005 - 00:47 #20
I fowler terminologi er Bruger jeres row gateway
Avatar billede fastpoint Nybegynder
26. april 2005 - 00:53 #21
Vi skal have en BrugerGateway til vores Bruger klasse.
Det eneste vores gateway skal gøre er, at sende et Bruger objekt tilbage.

At det så pludselig er Bruger klassen, som er vores row gateway giver ikke helt mening. Bruger er en normal java klasse uden forbindelse til databasen.

Nu kan vi ikke rigtigt teste for vi får en fejl

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

til koden fra før. Vi har
Avatar billede fastpoint Nybegynder
26. april 2005 - 06:08 #22
vi fik styr på den sidste fejl. kan du ligge et svare på hvorfor vi får en denne exception?

java.lang.NullPointerException

i denne kode?  Du må gerne ligge et svar på samme tid.

public static Bruger hentBruger(String brugerID, String passwrd)
  {
  try
  {
      String query = "SELECT * FROM bruger WHERE brugerID = '"+ brugerID +"' AND password = '"+ passwrd +"'";
      System.out.println(query);
      ResultSet result = statement.executeQuery(query);
     
      String brugernavn = "";
      String password = "";
      String afdeling = "";
      // test
      System.out.println(result.getString(1));
      //test færdig, testen blev ikke udskrevet!!
      brugernavn = result.getString(1);
      password = result.getString(2);
      afdeling = result.getString(3);
     

      return new Bruger(brugernavn,password,afdeling); 
  }  catch(Exception ax)
  {
    System.out.println(ax);
  }
      return null;
  }   
 
}
Avatar billede fastpoint Nybegynder
26. april 2005 - 06:53 #23
rettelse, men samme fejl og vi har kommenteret hvor vi mener den ligger.

Er det fordi metoden er static? database kaldet ligger i konstruktøren.

  public static Bruger hentBruger(String brugerID, String passwrd)
  {
  try
  {
    // String query = "SELECT * FROM bruger WHERE brugerID = '"+ brugerID +"' AND password = '"+ passwrd +"'";
      String query = "SELECT * FROM bruger WHERE brugerID = 'test' AND password = 'test'";
      statement = connection.createStatement();
      ResultSet result = statement.executeQuery(query); // HERFRA SER DET UD TIL DEN STOPPER

      String brugernavn = "";
      String password = "";
      String afdeling = "";
      while(result.next())
      {
      brugernavn = result.getString(1);
      password = result.getString(2);
      afdeling = result.getString(3);
      }
      return new Bruger(brugernavn,password,afdeling); 
     
  }  catch(Exception ax)
  {
    System.out.println(ax);
  }
      return null;
  }   
 
}
Avatar billede fastpoint Nybegynder
26. april 2005 - 07:05 #24
problemerne er løst hvis bare vi kan få denne fejl væk
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

hvordan tilføjer man den sit projekt?
Avatar billede arne_v Ekspert
26. april 2005 - 07:14 #25
I skal tilføje Oracle JDBC driver jar filen til classpath for projektet.

Til Java 1.4 med placering af Oracle 9i DB som på min PC er det f.eks.
C:/oracle/ora92/jdbc/lib/ojdbc14.jar
Avatar billede arne_v Ekspert
26. april 2005 - 07:18 #26
Og ja - når en metode er static så bliver en normal constructor ikke kaldt.

Man kan dog lave:

public class X {
  static {
      // kode som udføres før static metoder
  }
  public static void xxxx() {
      ...
  }
}

Men når jeres Bruger klasse snarere er en DTO klasse, så bør I nok droppe
de statis og lave:

BrugerGateway bg = new BrugerGateway();
bruger b = bg.hentBruger();

Den passer sp ike helt til Fowler, men ....
Avatar billede arne_v Ekspert
26. april 2005 - 07:18 #27
og et svar
Avatar billede fastpoint Nybegynder
26. april 2005 - 13:53 #28
Vi skal ikke lade dig lide mere:)

I den anledning har vi et sidste hygge spørgsmål.
Er en gateway enten row data eller table data gateway? eller kan det være begge dele?

Du har set vores kode over dig og siger det er et row gateway. Vi sender et ID og får et objekt tilbage. Hvad hvis vi vil have alt i tabellen? Skal vi så bruge table data gateway?
Avatar billede arne_v Ekspert
26. april 2005 - 13:57 #29
Det er enten row eller table gateway - det kan ikke være begge to samtidigt

Det kan være begge dele. Se Kommentar 25/04-2005 22:48:50
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