CruellaDeVille Skrevet 15. mai 2006 Del Skrevet 15. mai 2006 Jeg har fire forskjellige objekttyper jeg skal sette inn i en database, og for å lage en generisk applikasjon ønsker jeg at databaseobjektet ikke skal være nødt til å bry seg om hvilken type objekt som skal settes inn, det skal de respektive objektene tenke på. Når en skal hente UT et objekt fra database finnes det en get<type>-metode (getInt(), getString(), getDate()), finnes det en tilsvarende set<type> ? Da tar man utgangspunkt i Jdbc Types, som kan oversettes til tall. Finnes det noe tilsvarende andre veien? At javas String, Integer, GregorianCalendar har en tilsvarende tallkode som kan brukes i en switch? Lenke til kommentar
HV Skrevet 15. mai 2006 Del Skrevet 15. mai 2006 Hei Det er jo sikkert mulig å putte alle disse dataene i varchar, men du skal jo hente alt ut også. På meg virker det 100% ulogisk å lage en wrapper klasse for så primitive datatyper. Vennlig hilsen HV Lenke til kommentar
CruellaDeVille Skrevet 15. mai 2006 Forfatter Del Skrevet 15. mai 2006 Hei Det er jo sikkert mulig å putte alle disse dataene i varchar, men du skal jo hente alt ut også. På meg virker det 100% ulogisk å lage en wrapper klasse for så primitive datatyper. Vennlig hilsen HV 6110951[/snapback] Poenget er at jeg ikke vil lage en insert for hvert objekt, men heller ha en insertmetode og la klassene selv bestemme hvordan denne skal se ut. Eks private HashMap kindergartenInputValues(JTextField[] fields){ String[] columnNames = {"name", "street", "postNr", "postOffice", "boss", "numTotal"}; HashMap<String, Object> h = new HashMap<String, Object>(); String name = fields[0].getText(); String street = fields[1].getText(); String postNr = fields[2].getText(); String postOffice = fields[3].getText(); String boss = fields[4].getText(); String numTotal = fields[5].getText(); if(isNumeric("\\d+", numTotal, "Antall plasser") && isNumeric("\\d{4}", postNr, "Postnummer")){ h.put(columnNames[0], name); h.put(columnNames[1], street); h.put(columnNames[2], postNr); h.put(columnNames[3], postOffice); h.put(columnNames[4], boss); h.put(columnNames[5], numTotal); int numTot = Integer.parseInt(numTotal); Kindergarten kinderg = new Kindergarten(name, street, postNr, postOffice, boss, numTot); System.out.println(kinderg.toString()); } return h; } Når jeg skal sette dette inn i databasen bruker jeg PreparedStatement, og erstatter hver input-verdi med ? (slik jeg har lest i tutorial) Så skal jeg sette ordentlige verdier, og da må jeg bruke setString(), setInt(), og dermed må jeg ha en insert for hver objekttype (hvilket jeg vil unngå) public void insert (String table, HashMap values) throws SQLException{ PreparedStatement s = null; String prepStat = ""; for(int i=0; i<values.size();i++){ prepStat +="? "; prepStat = prepStat.replace(" ", ","); } prepStat = prepStat.substring(0, prepStat.length()-1); Iterator iter = values.keySet().iterator(); String keys = ""; while(iter.hasNext()){ keys += (String)iter.next() + ","; } keys = keys.substring(0,keys.length()-1); s = dbConn.getConnection().prepareStatement ( "INSERT INTO " + table + " (" + keys + ") VALUES(" + prepStat + ")"); iter = values.values().iterator(); int counter = 1; while(iter.hasNext()){ s.setString(counter, (String)iter.next());//<-HER! counter++; } count = s.executeUpdate (); s.close (); } Så det jeg lurer på er om løkken min kan gjøres anderledes, slik at jeg ikke må lage en spørring pr objekttype. Lenke til kommentar
HV Skrevet 16. mai 2006 Del Skrevet 16. mai 2006 Du er helt naturlig å lage forskjellige insert metoder for hver objekt type, men har du kun 1 type så er det nok med 1. I J2EE skriver vi jo en lang klasse + 2 interface for hver eneste objekt type også. Har ikke helt skjønt hvilken og hvor mange forskjellige objekt typer du har, du kan jo gjerne poste konstruktøren. Ser jo ikke et eneste av dem i eksemplene, du stapper jo bare alt inn i den hashtablen. Det er jo nesten så det ikke blir oo programmering lenger. Hvis alle objektene er veldig like kanskje du kan korte dem ned til kun et? Har alle objektene de noenlunde de samme variablene? Noen objekter har jo et kommentar felt, noe som blir beskrevet som text eller vachar i databasen der du kan sende inn hva enn det måtte være, man da vet du jo også hva du henter ut fra den kolonnen også. Poenget er at jeg ikke vil lage en insert for hvert objekt, men heller ha en insertmetode og la klassene selv bestemme hvordan denne skal se ut. Når jeg skal sette dette inn i databasen bruker jeg PreparedStatement, og erstatter hver input-verdi med ? (slik jeg har lest i tutorial)Så skal jeg sette ordentlige verdier, og da må jeg bruke setString(), setInt(), og dermed må jeg ha en insert for hver objekttype (hvilket jeg vil unngå) Skal du ha et hurtig, sikkert og robust program kommer du ikke unna dette. Post gjerne konstruktørene til disse objektene dine, det hjelper mye. Vennlig hilsen High Voltage Lenke til kommentar
CruellaDeVille Skrevet 16. mai 2006 Forfatter Del Skrevet 16. mai 2006 Du er helt naturlig å lage forskjellige insert metoder for hver objekt type, men har du kun 1 type så er det nok med 1. I J2EE skriver vi jo en lang klasse + 2 interface for hver eneste objekt type også. Har ikke helt skjønt hvilken og hvor mange forskjellige objekt typer du har, du kan jo gjerne poste konstruktøren. Ser jo ikke et eneste av dem i eksemplene, du stapper jo bare alt inn i den hashtablen. Det er jo nesten så det ikke blir oo programmering lenger. Hvis alle objektene er veldig like kanskje du kan korte dem ned til kun et? Har alle objektene de noenlunde de samme variablene? Noen objekter har jo et kommentar felt, noe som blir beskrevet som text eller vachar i databasen der du kan sende inn hva enn det måtte være, man da vet du jo også hva du henter ut fra den kolonnen også. Poenget er at jeg ikke vil lage en insert for hvert objekt, men heller ha en insertmetode og la klassene selv bestemme hvordan denne skal se ut. Når jeg skal sette dette inn i databasen bruker jeg PreparedStatement, og erstatter hver input-verdi med ? (slik jeg har lest i tutorial)Så skal jeg sette ordentlige verdier, og da må jeg bruke setString(), setInt(), og dermed må jeg ha en insert for hver objekttype (hvilket jeg vil unngå) Skal du ha et hurtig, sikkert og robust program kommer du ikke unna dette. Post gjerne konstruktørene til disse objektene dine, det hjelper mye. Vennlig hilsen High Voltage 6112344[/snapback] Konstruktører: Søknad: public Application(int appID,String date, int pID, int kID, int pri1, int pri2, int pri3, boolean specN){ applicationID = appID; appDate = ConvertDate.convertGregorianDate(date); parentID = pID; childID = kID; this.pri1 = pri1; this.pri2 = pri2; this.pri3 = pri3; specialNeeds = specN; } Person->parent/child public Person(int id, String firstN, String lastN){ this.personID = id; this.fName = firstN; this.lName = lastN; } public Parent(int id, String fName, String lName, String adress, String postNO, String postO, String email){ super(id, fName, lName); this.adress = adress; this.postNO = postNO; this.postOffice = postO; this.email = email; } public Child(int id, String firstN, String lastN, String birthdate, int parentID){ super(id, firstN, lastN); this.birthDate = ConvertDate.convertGregorianDate(birthdate); // GregorianCalendar-objekt this.parentID = parentID; } Og det er klassene jeg har. I application er nesten alle variablene int, i de andre er nesten alle string (med unntak av noen få) Jeg vet ikke om jeg klarer å formulere tankene mine på en fornuftig måte. Lenke til kommentar
HV Skrevet 16. mai 2006 Del Skrevet 16. mai 2006 Heisann, nå har jeg god tid Det finnes ingen grunner for å prøve å stappe all denne dataen inn i en tabell. Denne databasen skal innholde 3 tabeller: Application Parent Child Disse trenger også 3 forskjellige insert metoder... Hvis du i det hele tatt for knotet dette inn i 1 metode, blir det ikke bare vanskelig of uforståelig, det blir også en veldig dårlig løsning. Du kan da alltids kalle disse 3 metode for insert, da trenger du bare huske insert metoden også tar DAO objektet seg av resten... public void insert(Application application){ public void insert(Parent parent){ public void insert(Child child){ mer logiske er kanskje: public void insertApplication(Application application){ osv... Metode navn skal jo også være logiske:p Noen andre ting fra koden du viste: Tror ikke du får utnyttet effekten av PreparedStatment på den måten som er visst i eksemplet, PreparedStatment oppretter man lenge før man kommer til den aktuelle metoden, samt at den er mest effektiv når det er snakk om feks flere insert etterhverandre. Vet jo ikke så mye om hvordan du har bygd ting opp, men å kast SQLException videre fra DAO klassen er litt tvilsomt, å fange sql feil i et presentasjonslag er fyfy. Vennlig hilsen HV Lenke til kommentar
Peter Skrevet 16. mai 2006 Del Skrevet 16. mai 2006 Nå har jeg ikke lest så nøye her, men høres ut som du kan bruke serialize og lagre avkommet sammen med en ID som sier hva slags object du har "serialized" ? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå