Avatar billede mikmakmuk Nybegynder
12. november 2003 - 17:24 Der er 23 kommentarer og
1 løsning

pæn opstilling af udtryk

Hej Eksperter,

Jeg danner en forespørsel til en database på denne måde


ResultSet rs = d.select("select k.kunstner, p.title from kunstner k, plader p where k.kunst_id = p.kunst_id and k.kunstner = \""+result+"\" order by k.kunstner;");

spørgsmålet er hvordan jeg på den smarteste måde får sat det op så det bliver lidt lettere at læse :-) Jeg vil gerne have sqlsætningen delt ud i bidder som bliver sat sammen inden de bliver kørt.
Avatar billede repsak Nybegynder
12. november 2003 - 17:34 #1
StringBuffer b = new StringBuffer();
b.append("SELECT k.kunstner, p.title ");
osv...
FROM kunstner k, plader p
WHERE k.kunst_id = p.kunst_id
  AND k.kunstner = \""+result+"\"
ORDER BY k.kunstner
Avatar billede repsak Nybegynder
12. november 2003 - 17:34 #2
ResultSet rs = d.select(b.toString());
Avatar billede jakoba Nybegynder
12. november 2003 - 17:39 #3
eller evt blot:

ResultSet rs = d.select(
    "select k.kunstner, p.title "
  +"from kunstner k, plader p "
  +"where k.kunst_id = p.kunst_id "
  +"  and k.kunstner = \""+result+"\" "
  +"order by k.kunstner;"  );

  Koncatenering af strenge bliver ogte brugt som exempel på hvordan uigennemtænkt bruge af java's faciliteter kan give langsom og ineffektiv kode.
  I forhold til udgiften ved et database-kald er det dog nul og nix.

mvh JakobA
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 17:43 #4
okay. Hvad er det bedste?
Avatar billede repsak Nybegynder
12. november 2003 - 17:43 #5
jakoba -> jeg forstod ikke dit budskab???
Avatar billede repsak Nybegynder
12. november 2003 - 17:44 #6
Mit eksempel er da både hurtigere, mere ressourcsbesparende og lette at overskue
Avatar billede jakoba Nybegynder
12. november 2003 - 17:51 #7
Det er også mest en religiøs uenighed.

Repsak har helt ret i at hans metode er hurtigere og mere ressource besparende.

Jeg synes dog ikke den er 'mere overskuelig', og mener at min øgede overskuelighed er ressourcespildet værd i dette tilfælde.

mvh JakobA
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 17:55 #8
okay :-)
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 18:03 #9
Hvad er der galt med det her?

StringBuffer bu = new StringBuffer();
                    bu.append("select k.kunstner, p.cover_title, t.title_navn");
                    bu.append("from kunstner k, plader p, titler t, plade_title_relation pr");
                    bu.append("where k.kunst_id = p.kunst_id");
                    bu.append("and  pr.plade_id = p.plade_id");
                    bu.append("and  pr.title_id = t.title_id");
                    bu.append("and  k.kunstner like \""+result+"\"");
                   
        ResultSet rs = d.select(bu.toString());
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 18:07 #10
Jeg har fundet ud af det :-) Det var bare nogle mellemrum som manglede

bu.append("from kunstner k, plader p, titler t, plade_title_relation pr");
skulle være
bu.append("from kunstner k, plader p, titler t, plade_title_relation pr ");
Avatar billede arne_v Ekspert
12. november 2003 - 19:13 #11
Stop.

Protest.

Generelt er det en performance mæssig fordel at bruge StringBuffer
append fremfor String +.

Men det gælder *ikke* i dette tilfælde.

Løsningen med String + performer bedre end StringBuffer append
i dette tilfælde.

De ville være langsommere hvis der runtime blev lavet temporære String
objekter, men det gør det ikke.

Compileren optimere de strenge og laver det om til en streng på compile
time.

Lad mig give et lille eksempel:

C:\>type C1.java
public class C1 {
  public static void main(String[] args) {
      String s = "aaaaaaaaaaaaaaaaaaaaa" +
                "bbbbbbbbbbbbbbbbbbbbb" +
                "ccccccccccccccccccccc";
      System.out.println(s);
  }
}

C:\>javap -c C1
Compiled from C1.java
public class C1 extends java.lang.Object {
    public C1();
    public static void main(java.lang.String[]);
}

Method C1()
  0 aload_0
  1 invokespecial #1 <Method java.lang.Object()>
  4 return

Method void main(java.lang.String[])
  0 ldc #2 <String "aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbccccccccccccccccc
cccc">
  2 astore_1
  3 getstatic #3 <Field java.io.PrintStream out>
  6 aload_1
  7 invokevirtual #4 <Method void println(java.lang.String)>
  10 return

C:\>type C2.java
public class C2 {
  public static void main(String[] args) {
      StringBuffer sb = new StringBuffer("");
      sb.append("aaaaaaaaaaaaaaaaaaaaa");
      sb.append("bbbbbbbbbbbbbbbbbbbbb");
      sb.append("ccccccccccccccccccccc");
      System.out.println(sb.toString());
  }
}

C:\>javap -c C2
Compiled from C2.java
public class C2 extends java.lang.Object {
    public C2();
    public static void main(java.lang.String[]);
}

Method C2()
  0 aload_0
  1 invokespecial #1 <Method java.lang.Object()>
  4 return

Method void main(java.lang.String[])
  0 new #2 <Class java.lang.StringBuffer>
  3 dup
  4 ldc #3 <String "">
  6 invokespecial #4 <Method java.lang.StringBuffer(java.lang.String)>
  9 astore_1
  10 aload_1
  11 ldc #5 <String "aaaaaaaaaaaaaaaaaaaaa">
  13 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  16 pop
  17 aload_1
  18 ldc #7 <String "bbbbbbbbbbbbbbbbbbbbb">
  20 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  23 pop
  24 aload_1
  25 ldc #8 <String "ccccccccccccccccccccc">
  27 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  30 pop
  31 getstatic #9 <Field java.io.PrintStream out>
  34 aload_1
  35 invokevirtual #10 <Method java.lang.String toString()>
  38 invokevirtual #11 <Method void println(java.lang.String)>
  41 return

Der er vist ingen tvivl om hvad der er hurtigst.

Så i dette tilfælde vil String + bære hurtigst (objektivt) og
pænest (subjektivt).
Avatar billede repsak Nybegynder
12. november 2003 - 19:37 #12
mikmakmuk -> du må nok hellere høre på arne_v. Mit indlæg byggede ikke på en så avenceret performancetest. Men normalt vil StringBuilder være at foretrække :-)
Avatar billede arne_v Ekspert
12. november 2003 - 20:00 #13
StringBuffer sb = new StringBuffer("");
for(int i = 0; i < 10000; i++) {
  sb.append("x");
}

er meget hurtigere end:

String s = "";
for(int i = 0; i < 10000; i++) {
  s += "x";
}

fordi der vil den lave 10000 objekter som også skal garbage collectes.

Og den kan ikke lave noget smart.

Det kan den imidlertid ved "..." + "..." + "...".
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:17 #14
respekt arne_v :-) Jeg vel bare gerne lære :-)
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:17 #15
vil
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:21 #16
Jeg er mere end glad for alle svarerne :-)
Det endte med

StringBuffer bu = new StringBuffer();
                    bu.append("select k.kunstner, p.cover_title, t.title_navn ");
                    bu.append("from kunstner k, plader p, titler t, plade_title_relation pr ");
                    bu.append("where k.kunst_id = p.kunst_id ");
                    bu.append("and  pr.plade_id = p.plade_id ");
                    bu.append("and  pr.title_id = t.title_id ");
                    bu.append("and  k.kunstner like \""+result+"\"");
                   
        ResultSet rs = d.select(bu.toString());

Det kan godt være at det ikke er det bedste, men jeg er glad for det og jeg kan læse det :-)
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:23 #17
resultatet kan ses her, hvis ellers min computer er tændt :-)

http://web-oasen.dk:8080/xmltest/xml6.html
Avatar billede repsak Nybegynder
12. november 2003 - 20:26 #18
mikmakmuk -> så længe at det ikke drejer sig om flere objekter er det ren religion, for om der bliver oprettet et par objekter mere eller mindre har ikke nogen praktisk betydning. Der er ren teori :-)

arne -> hvornår kan det så betale sig at bruge StringBuffer?
Avatar billede arne_v Ekspert
12. november 2003 - 20:30 #19
Som jeg skrev i mit 12/11-2003 20:00:02 indlæg: i de klassiske
eksempler med en løkke er StringBuffer hurtigere end String.

Man skal dog nok op på nogle appends førend forskellen kan mærkes.
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:34 #20
bare der ikke er nogen som er sure så er jeg glad. Jeg syntes bare det er kanon at jeg kan få noget hjælp :-)
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:36 #21
Jeg har ikke ord for hvor meget respekt jeg har for folk som jer.
Avatar billede mikmakmuk Nybegynder
12. november 2003 - 20:37 #22
Det er stort!!!!! Jeg kan gøre nogle ting som jeg ellers kun kunne drømme om fordi der er folk som gider hjælpe.
Avatar billede repsak Nybegynder
12. november 2003 - 20:37 #23
hva' arne burde du ikke lige få nogle af mine points så?
Avatar billede arne_v Ekspert
12. november 2003 - 20:53 #24
Det gider vi ikke bøvle med.
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