Gå til innhold

Wrapperklasse for et databaseobjekt


Anbefalte innlegg

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
Videoannonse
Annonse

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
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

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
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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...