/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Java/database
Fra : Maxi


Dato : 29-09-03 20:21

Jeg henter nogle data ud fra databasen. Eksempelvis SELECT telefonnummer,
adresse, navn FROM user;
Nu vil jeg gerne gemme disse data i en array/vector eller noget helt tredie
så jeg kan arbejde med disse data'er, uden at hele tiden skal hente dem fra
databasen hver gang jeg skal bruge dem. Men jeg er lidt i tvivl om hvordan
det skal gøres. Størrelsen af en array skal fastlægges allerede i
begyndelsen. Ellers er der vectorer, men vectorer skal jo have objekter?
Nogen der har nogen forslag til hvad jeg kan gøre?



 
 
Morten K. Hansen (29-09-2003)
Kommentar
Fra : Morten K. Hansen


Dato : 29-09-03 20:42

Den 29-09-2003 21:21, skrev Maxi:


> Jeg henter nogle data ud fra databasen. Eksempelvis SELECT telefonnummer,
> adresse, navn FROM user;
> Nu vil jeg gerne gemme disse data i en array/vector eller noget helt tredie
> så jeg kan arbejde med disse data'er, uden at hele tiden skal hente dem fra
> databasen hver gang jeg skal bruge dem. Men jeg er lidt i tvivl om hvordan
> det skal gøres. Størrelsen af en array skal fastlægges allerede i
> begyndelsen. Ellers er der vectorer, men vectorer skal jo have objekter?
> Nogen der har nogen forslag til hvad jeg kan gøre?
>
>
Lav en klasse, eg. User I den kan du så gemme dine attributter
telefonnummer, adresse og navn. Smid resultatet af søgningen ind i hvert
sit objekt af denne klasse, som du så kan smide i en vector.

--
Mvh / Regards
Morten K. Hansen    http://hansen-winkel.dk/
Replying by mail? Change 'spam' to my first name.


Maxi (29-09-2003)
Kommentar
Fra : Maxi


Dato : 29-09-03 22:35

Men hvordan kan jeg lave en søgning i de oprettede objekter. Har lavet noget
ligende som du siger.
Hvis jeg nu ønsker at finde den objekt hvor navnet er Jesper, hvordan finder
jeg den i vektoren?
Nedenfor er kode eksemplet.

/* Her opretter jeg et kunde objekt og lægger indholdet i en vektor */

import java.sql.*;
import java.util.*;

public class CreateDatabase
{
private Connection conn;
private Statement stmt;
private String column[]=new String[3];

public CreateDatabase() throws Exception
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn= DriverManager.getConnection ("jdbcbc:database", "", "");
stmt = conn.createStatement();


}

public Vector getAll() throws SQLException
{
Vector all = new Vector();
ResultSet rs = stmt.executeQuery("SELECT UserID, Username, Password FROM
user");
while (rs.next())
{

Kunde k = new Kunde( rs.getInt(1), rs.getString(2), rs.getString(3) );
all.addElement(k);
}
return all;
}
}

/* kunde klassen */
/////////////////////////////////////////////
public class Kunde
{
String username;
String password;
int userID;


public Kunde(int id, String u, String p)
{
userID = id;
username = u;
password = p;

}

public String toString()
{
return "UserID: " + userID + " Username: " + username+" Password:
"+password;
}

public String hej()
{
return "Hej";
}
}

/*main */
//////////////////////////////////////////////
import java.util.*;

public class MainUse
{
public static void main(String[] arg)
{
try
{

CreateDatabase db = new CreateDatabase();
CreateDatabase db1;

Vector v = db.getAll();
System.out.println("Hent alle dataer: "+v);
}
catch(Exception e)
{
System.out.println("Problem med database: "+e);
e.printStackTrace();
}
}
}



"Morten K. Hansen" <spam@hansen-winkel.dk> wrote in message
news:bla901.3js.1@news.hansen-winkel.dk...
> Den 29-09-2003 21:21, skrev Maxi:
>
>
> > Jeg henter nogle data ud fra databasen. Eksempelvis SELECT
telefonnummer,
> > adresse, navn FROM user;
> > Nu vil jeg gerne gemme disse data i en array/vector eller noget helt
tredie
> > så jeg kan arbejde med disse data'er, uden at hele tiden skal hente dem
fra
> > databasen hver gang jeg skal bruge dem. Men jeg er lidt i tvivl om
hvordan
> > det skal gøres. Størrelsen af en array skal fastlægges allerede i
> > begyndelsen. Ellers er der vectorer, men vectorer skal jo have objekter?
> > Nogen der har nogen forslag til hvad jeg kan gøre?
> >
> >
> Lav en klasse, eg. User I den kan du så gemme dine attributter
> telefonnummer, adresse og navn. Smid resultatet af søgningen ind i hvert
> sit objekt af denne klasse, som du så kan smide i en vector.
>
> --
> Mvh / Regards
> Morten K. Hansen http://hansen-winkel.dk/
> Replying by mail? Change 'spam' to my first name.
>



kgc (30-09-2003)
Kommentar
Fra : kgc


Dato : 30-09-03 06:40

Maxi wrote:
> Men hvordan kan jeg lave en søgning i de oprettede objekter. Har lavet noget
> ligende som du siger.
> Hvis jeg nu ønsker at finde den objekt hvor navnet er Jesper, hvordan finder
> jeg den i vektoren?

Tja, det kommer nok lidt an på hvor meget du skal søge. Hvis du skal
lave mange opslag efter forskellige objekter, og du ikke ønsker at have
flere ens objekter i din "liste", så er det måske HashMap du skal kigge
på (benyttes i stedet for Vector).

Desuden kan du jo se i API'en at en Vector har følgende metode:

int    indexOf(Object elem)
Searches for the first occurence of the given
argument,testing for equality using the equals method.

Så hvis du bare sørger for at skrive en hensigtsmæssig equals-metode i
din kunde-klasse, så skulle dette også være en mulighed. Hvordan din
equals-metode skal se ud, afhænger lidt af hvad du skal kunne søge på,
men en mulighed (hvor userID ignoreres, og der sammenlignes på username
og password afhængig af hvilke af disse der er udfyldt - dvs. forskellig
fra null - i det objekt du sammenligner med) kunne måske være noget i
stil med dette (ikke kompileret og testet, så tilret selv):

public class Kunde
{
String username;
String password;
int userID;


public Kunde(int id, String u, String p)
{
userID = id;
username = u;
password = p;
}


public boolean equals(Object obj) {
if (obj instanceof Kunde) {
Kunde comp = (Kunde) obj;
if (username <> null && !username.equals(comp.username))
{
return false;
}
if (password <> null && !password.equals(comp.password))
{
return false;
}
} else {
return false;
}
return true;
}
}

Hensigten er at hvis du kun skal søge på username, laver du et
Kunde-objekt hvor du kun udfylder username, og så benytter du indexOf på
dette objekt. Password vil blive ignoreret. Alt dette under forudsætning
af, at indexOf metoden er implementeret som API'en skriver.

Mvh. Kasper


kgc (30-09-2003)
Kommentar
Fra : kgc


Dato : 30-09-03 11:44

> Så hvis du bare sørger for at skrive en hensigtsmæssig equals-metode
Hmm, jeg svarede vist lidt for tidligt på dagen. Den af mig foreslåede
equals-metode opfylder ikke den generelle kontrakt vedr. equals-metoder,
og bør måske ikke anbefales. I hvert fald kan det, selvom det mulgivis
virker med den nuværende indexOf-metode, ikke forventes at fungere med
evt. fremtidige implementationer.

Måske den enkle løsning i virkeligheden er bedst: Lav en søg-metode der
løber din Vector igennem og sammenligner objekt for objekt, til du
finder det du søger. Så kan du frit vælge hvorledes søgekriterierne skal
være.

Alternativt er HashMap stadig anbefalelsesværdig, hvis den passer ind i
det du skal bruge det til. Du får hurtige opslag, men mister
"rækkefølgen" samt muligheden for at have duplikerede forekomster (dvs.
objekter der er ens jvf. equals-metoden som du jo selv kan skrive).

Endelig en tanke: Hvorfor egentlig læse data ind i en objekt-struktur
for så at søge i dem. Kan du ikke blot "selecte" direkte fra databasen?
Det kan selvfølgelig være et spørgsmål om ydelse, men overvej det lige?

Mvh. Kasper


Maxi (30-09-2003)
Kommentar
Fra : Maxi


Dato : 30-09-03 17:08

HashMap kan ikke benyttes i denne sammenhæng fordi man skal definere
størrelsen i forvejen. Det var også en af de løsninger jeg overvejede. Og
årsagen til at jeg vil lægge data'erne i en vector er for at undgå at
belaste databasen for meget.


Den her løsning virker meget fornuftigt men lige hvordan skal jeg
implementere denne søge funktion. Skal den implementeres i min Kunde klasse?
(Se tidligere indlæg med kode).

> Måske den enkle løsning i virkeligheden er bedst: Lav en søg-metode der
> løber din Vector igennem og sammenligner objekt for objekt, til du
> finder det du søger. Så kan du frit vælge hvorledes søgekriterierne skal
> være.




Jesper Matthiesen (30-09-2003)
Kommentar
Fra : Jesper Matthiesen


Dato : 30-09-03 23:21

HashMap resizer da dynamisk?
-J

> HashMap kan ikke benyttes i denne sammenhæng fordi man skal definere
> størrelsen i forvejen. Det var også en af de løsninger jeg overvejede. Og
> årsagen til at jeg vil lægge data'erne i en vector er for at undgå at
> belaste databasen for meget.
>
>
> Den her løsning virker meget fornuftigt men lige hvordan skal jeg
> implementere denne søge funktion. Skal den implementeres i min Kunde
klasse?
> (Se tidligere indlæg med kode).
>
> > Måske den enkle løsning i virkeligheden er bedst: Lav en søg-metode der
> > løber din Vector igennem og sammenligner objekt for objekt, til du
> > finder det du søger. Så kan du frit vælge hvorledes søgekriterierne skal
> > være.
>
>
>



kgc (01-10-2003)
Kommentar
Fra : kgc


Dato : 01-10-03 06:32

Maxi wrote:
> HashMap kan ikke benyttes i denne sammenhæng fordi man skal definere
> størrelsen i forvejen.
Så vidt jeg husker, så tilpasser HashMap da sin størrelse dynamisk. Jvf.
API'en:

An instance of HashMap has two parameters that affect its performance:
initial capacity and load factor. The capacity is the number of buckets
in the hash table, and the initial capacity is simply the capacity at
the time the hash table is created. The load factor is a measure of how
full the hash table is allowed to get before its capacity is
automatically increased. When the number of entries in the hash table
exceeds the product of the load factor and the current capacity, the
capacity is roughly doubled by calling the rehash method.

> årsagen til at jeg vil lægge data'erne i en vector er for at undgå at
> belaste databasen for meget.
Det kan der selvfølgelig være fornuft i, hvis du skal lave mange opslag,
hvoraf en del er efter de samme elementer, og databasen er hård belastet
(f.eks. hvis du har mange brugere eller en langsom database). Husk dog
også på at fornuftige nøgler i databasen, kan medvirke til at
enkelt-opslag (select) ikke er særligt tidskrævende.

> Den her løsning virker meget fornuftigt men lige hvordan skal jeg
> implementere denne søge funktion. Skal den implementeres i min Kunde klasse?
> (Se tidligere indlæg med kode).

Du kunne godt lave den som en static-metode i din Kunde-klasse, men jeg
ville syntes det var et lidt mærkeligt design. Hvis du har flere
funktioner du skal udføre på din "kunde-liste", eller hvis du har flere
"typer" af søgninger med forskellige kriterier, ville jeg måske lave en
klasse med disse (statiske) "værktøjsmetoder" inklusiv søgning, men
ellers kan du bare lave en metode i din main-klasse. Så længe dine
felter i Kunde-klassen har default-access (ikke f.eks. private) så er
dette meget lige ud af landevejen. Det ville dog være pænere
objekt-orientering at lave dem private og så lave get- og evt. set-
metoder (hvorefter det igen er simpelt nok at lave søgningen). Her er et
forslag til en metode der søger på navn og returnerer den fundne kunde.
Der returneres null hvis kunden ikke findes:

static Kunde findName(String name) {
Enumerator enum = v.elements();
while (v.hasMoreElements() {
Kunde kunde = (Kunde) enum.nextElement();
if (kunde.username.equals(name)) {
return kunde;
}
}
return null;
}

Mvh. Kasper


Maxi (01-10-2003)
Kommentar
Fra : Maxi


Dato : 01-10-03 18:29

Det virker hos mig nu. Tak for hjælpen :)

"kgc" <nospam1@webspeed.dk> wrote in message
news:3f7a66d9$0$54817$edfadb0f@dread11.news.tele.dk...
> Maxi wrote:
> > HashMap kan ikke benyttes i denne sammenhæng fordi man skal definere
> > størrelsen i forvejen.
> Så vidt jeg husker, så tilpasser HashMap da sin størrelse dynamisk. Jvf.
> API'en:
>
> An instance of HashMap has two parameters that affect its performance:
> initial capacity and load factor. The capacity is the number of buckets
> in the hash table, and the initial capacity is simply the capacity at
> the time the hash table is created. The load factor is a measure of how
> full the hash table is allowed to get before its capacity is
> automatically increased. When the number of entries in the hash table
> exceeds the product of the load factor and the current capacity, the
> capacity is roughly doubled by calling the rehash method.
>
> > årsagen til at jeg vil lægge data'erne i en vector er for at undgå at
> > belaste databasen for meget.
> Det kan der selvfølgelig være fornuft i, hvis du skal lave mange opslag,
> hvoraf en del er efter de samme elementer, og databasen er hård belastet
> (f.eks. hvis du har mange brugere eller en langsom database). Husk dog
> også på at fornuftige nøgler i databasen, kan medvirke til at
> enkelt-opslag (select) ikke er særligt tidskrævende.
>
> > Den her løsning virker meget fornuftigt men lige hvordan skal jeg
> > implementere denne søge funktion. Skal den implementeres i min Kunde
klasse?
> > (Se tidligere indlæg med kode).
>
> Du kunne godt lave den som en static-metode i din Kunde-klasse, men jeg
> ville syntes det var et lidt mærkeligt design. Hvis du har flere
> funktioner du skal udføre på din "kunde-liste", eller hvis du har flere
> "typer" af søgninger med forskellige kriterier, ville jeg måske lave en
> klasse med disse (statiske) "værktøjsmetoder" inklusiv søgning, men
> ellers kan du bare lave en metode i din main-klasse. Så længe dine
> felter i Kunde-klassen har default-access (ikke f.eks. private) så er
> dette meget lige ud af landevejen. Det ville dog være pænere
> objekt-orientering at lave dem private og så lave get- og evt. set-
> metoder (hvorefter det igen er simpelt nok at lave søgningen). Her er et
> forslag til en metode der søger på navn og returnerer den fundne kunde.
> Der returneres null hvis kunden ikke findes:
>
> static Kunde findName(String name) {
> Enumerator enum = v.elements();
> while (v.hasMoreElements() {
> Kunde kunde = (Kunde) enum.nextElement();
> if (kunde.username.equals(name)) {
> return kunde;
> }
> }
> return null;
> }
>
> Mvh. Kasper
>



Jonas Kongslund (02-10-2003)
Kommentar
Fra : Jonas Kongslund


Dato : 02-10-03 12:30

kgc wrote:
> Så hvis du bare sørger for at skrive en hensigtsmæssig equals-metode i
> din kunde-klasse, så skulle dette også være en mulighed.
[...snip...]

Kontrakten for metoden hashCode defineret på java.lang.Object siger at
to objekter, som er ens (relativt til equals-metoden), skal returnere
samme værdi ved kald til hashCode.

Derfor: husk også at overskrive hashCode-metoden.

--
Jonas


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste