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.
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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
12. november 2003 - 17:34
#2
ResultSet rs = d.select(b.toString());
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
12. november 2003 - 17:43
#4
okay. Hvad er det bedste?
12. november 2003 - 17:43
#5
jakoba -> jeg forstod ikke dit budskab???
12. november 2003 - 17:44
#6
Mit eksempel er da både hurtigere, mere ressourcsbesparende og lette at overskue
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
12. november 2003 - 17:55
#8
okay :-)
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());
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 ");
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).
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 :-)
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 "..." + "..." + "...".
12. november 2003 - 20:17
#14
respekt arne_v :-) Jeg vel bare gerne lære :-)
12. november 2003 - 20:17
#15
vil
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 :-)
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?
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.
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 :-)
12. november 2003 - 20:36
#21
Jeg har ikke ord for hvor meget respekt jeg har for folk som jer.
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.
12. november 2003 - 20:37
#23
hva' arne burde du ikke lige få nogle af mine points så?
12. november 2003 - 20:53
#24
Det gider vi ikke bøvle med.
Kurser inden for grundlæggende programmering