2009-06-22 5 views
0

Ich habe ein Gateway geschrieben, um eine Ergebnismenge aus meiner Datenbank zu bekommen. Wie speichere ich jede Zeile in einem separaten Dao, so dass ich jeden Datensatz weiter bearbeiten kann? Oder kann ich direkt auf die Ergebnismenge zugreifen, um die Datensätze zu erhalten?Wie Datensätze aus einer Abfrage in DAOs zu setzen?

Das ist mein Gateway (btw, sollte ich die bedingte Logik innerhalb des cfquery in einem separaten cfc schreiben, der dieses erstreckt?)

<cfcomponent name="MaterialDao" hint="data access object" output="false"> 
<cffunction name="init" hint="constructor" access="public" output="false" returntype="MaterialDao"> 
    <cfargument name="dsn" type="String" required="true" hint="datasource" /> 
    <cfset variables.instance.dsn = arguments.dsn /> 
    <cfreturn this /> 
</cffunction> 

<cffunction name="readMaterial" hint="read" access="public" output="false" returntype="Query"> 
    <cfargument name="district" type="String" /> 
    <cfset var qReadMaterial = "" /> 
    <cfquery name="qReadMaterial" datasource="#variables.instance.dsn#"> 
    <cfif StructKeyExists(arguments,"district")> 
    SELECT A.NR, A.BEZ, D.BES, D.STA 
    <cfelse> 
    SELECT A.NR, A.BEZ 
    </cfif> 
    FROM DEK AS D INNER JOIN ART AS A 
    ON D.NR = A.NR 
    WHERE 0=0 
    <cfif StructKeyExists(arguments,"district")> 
    AND D.BEZ = #arguments.district# 
    </cfif> 
    ORDER BY A.BEZ 
</cfquery> 
<cfreturn qReadMaterial /> 
</cffunction> 
</cfcomponent> 

ich schon viele Artikel gelesen haben, und es scheint, dass es sind unterschiedliche Meinungen zu diesem Thema (DAO vs. Gateway, DAO & Gateway etc.). Was ist die beste Vorgehensweise, was machen die Profis?

+1

Ich bemerkte, dass Sie das # -Zeichen in Ihren cfif-Anweisungen verwendet haben. Es ist nicht notwendig, die Zeichen # zu verwenden, außer wenn Sie die Variable als Teil einer Ausgabe verwenden, z. B. für eine Abfrage, eine Sicht oder ein Argument eines Tags, wie Sie es mit dataSource = "# variables.instance.dsn #" getan haben. wo ist es zwischen Anführungszeichen. Nur ein kleiner Tipp, der Sie einige Tastenanschläge des Tippens speichern kann. :) – Jayson

+0

Ich integrierte Aarons Tipp und änderte mein Gateway, um ein Dao zu sein, um mehr in Einklang mit den Profis zu sein :) – mrt181

+0

Sie fehlen die abschließenden Parens auf Ihrem StructKeyExist überprüft. –

Antwort

3

Die Profis verwenden nur ein Muster für die Datenbank-Zugriffsschicht. Die Verwendung von DAO und Gateway ist falsch, da ich mir nicht sicher bin, wo es angefangen hat, aber es scheint nur in der ColdFusion-Menge zu existieren. Die DAO- und Gateway-Muster können ziemlich genau die gleiche Funktion erfüllen, aber ich denke, dass die DAO die Rechnung mehr erfüllt, wenn es um Datenbankinteraktion geht.

DAOs sollten Funktionen für CRUD-Methoden enthalten sowie Datensätze zurückgeben. Da CRUD und grundlegende Datensätze sehr repetitiv sind, verwende ich einen Code-Generator, um den Code für diese Interaktion zu erstellen und dann anzupassen, was ich brauche. Dies ist ein guter Platz für die bedingte Logik zum Auswählen der benötigten Datensätze.

Wie von Aaron erwähnt, ist das Zurückgeben eines Arrays von Objekten für eine Reihe von Datensätzen in Ihrer Datenbank in ColdFusion aufgrund des Leistungsaufwands beim Erstellen von Objekten nicht durchführbar. Ich verwende normalerweise nur die grundlegende Abfrage, die von dem DAO in meinen Ansichten zurückgegeben wird. Wenn das Ding, das ich modelliere, etwas Verhalten in einer Ansicht benötigt, dann werde ich die Abfrage in ein Objekt einfügen, indem ich etwas ähnlich wie Peter Bell verwende.

+0

mit DAO vs vs Gateways + DAO ist rein Geschmack, aber ich verwende auch nur DAO, alle DB-Interaktionen für ein Objekt an einem Ort. –

+0

Ich habe dem Dao eine readAll-Methode hinzugefügt, um den Effekt des Gateways (Suchdatensätze) zu erhalten. Wenn ich auf ein Ergebnis klicke (Link) (Datensatz auswählen), erstelle ich eine Standard-Bean und schreibe Daten aus mehreren Quellen über den Dao in die Bean. Ich folgte dem Artikel auf www.inknowkungfoo.com – mrt181

2

Peter Bell hatte vor einigen Monaten eine großartige Präsentation über seine Veröffentlichung des Iterating Business Object CFC, mit dem Sie mehrere Datensätze aufnehmen und mit diesem einfachen Framework über einen Datensatz gleichzeitig iterieren können: http://ibo.riaforge.org/. Bis CF beim Erzeugen von Objekten ein wenig schneller ist, ist das Recycling einer einzelnen Instanz eines Objekts und das erneute Auffüllen der Eigenschaften wahrscheinlich das Beste. Vielleicht kann dies Ihnen helfen, jeweils einen Datensatz in Ihr DAO zu laden.

Bedingte Logik kann in das Gateway oder in einen Manager CFC gehen. Normalerweise würde ich Logik, die einfach ist wie die Logik in Ihrem Beitrag direkt im CFC beschrieben.

Ein paar Ratschläge, möchten Sie vielleicht die arguments.distinct nicht erforderlich machen und eine einfache Überprüfung mit if (structKeyExists (Argumente, "distinct")) {etwas tun}.

Grüße,

-Aaron Greenlee

+0

Was ist der Unterschied zwischen einem Standardwert (anstelle von Null, die nicht in CF vorhanden ist) und structKeyExists (arg, "name")? – mrt181

1

In unserem Unternehmen haben wir uns einige Monate lang intensiv mit diesem Thema beschäftigt und den Adobe CF DAO-Ersteller über RDS und einige andere ältere Geräte getestet (jemand erinnert sich an CFPowerTools?).

Wir haben uns letztendlich entschieden, unseren eigenen DAO-Code-Generator zu schreiben und ich dachte, ich würde unsere Gedanken hier teilen. Der Grund, warum wir uns entschieden haben, war, dass wir Lock-Hints zu SQL hinzufügen mussten, wir wollten es effizienter, sicherer und sauberer machen.

Das Setup, das wir beschlossen haben, war ein vordefiniertes Basis-DAO-Objekt (DAO.cfc) zu erstellen, das alle 'Table'-DAOs erweitert hat. Alles, was es hatte, waren ein paar Utility-Methoden, aber die Hauptsache ist, dass wir alle anderen Funktionen hinzufügen können, auf die wir alle unsere generierten DAOs zugreifen müssen.

So generieren wir automatisch Code, indem Sie eine Tabelle aus der Datenbank (mit der CF-Admin-API) und erstellen Sie die [TableName].cfc DAO mit den üblichen init, Setter und Getters, also die grundlegenden CRUD Zeug.

Zusätzlich generieren wir auch eine [TableName]GatewayBase.cfc und eine [TableName]Gateway.cfc. [TableName]Gateway.cfc erweitert [TableName]GatewayBase.cfc.

So für eine Probe DAO laufen auf einem ‚Kunden‘ genannt Tabelle die erstellten Dateien sind:

Customers.cfc /* extends DAO.cfc [not created, already exists] */ 
CustomersGateway.cfc 
CustomersGatewayBase.cfc /* extends CustomersGateway */ 

die Idee ist also, dass das Gateway einen Weg mit vielen "Kunden-Datensätze zu behandeln bietet - Das DAO wird verwendet, wenn es um einen einzelnen geht. Alle Methoden im Gateway geben im Allgemeinen ein CF-Abfrageobjekt zurück. CF ist zu ineffizient, um riesige Arrays von DAO-Objekten zu erstellen, und in unserer Vorstellung ist das Abfrageobjekt in CF wirklich flexibel, weshalb wir es gerne verwenden.

Bei der Codierung wird nur die Unterklasse CustomerGateway.cfc instanziiert und verwendet. Die Basisklasse, die es erweitert, hat jedoch einige sehr nützliche generische Funktionen, die kostenlos sind, wie getFieldListByProperty(), die basierend auf übergebenen Parametern bestimmte Felder (dh Tabellenspalten) durch eine bestimmte Eigenschaft (dh einen Spaltenwert) zurückgeben, so zum Beispiel:

myGateway.getFieldListByProperty(property="status", value="1", fieldList="customerName,customerID", orderBy="createdOn") /> 

der Anruf wird wieder die ‚customer‘ und ‚customerID‘ Werte für alle Kunden mit dem Status 1, von dem Datum sortiert sie erstellt wurden. Der Code ist auch gegen SQL-Injection gehärtet und validiert, so dass sinnvolle Ausnahmen ausgelöst werden.

Diese Funktion wird 99% (wir hoffen!) Der Multi-Record-Abfrage, die Sie für eine Tabelle ausführen, bereitstellen. Wenn Sie eine anspruchsvollere Abfrage benötigen, können Sie die Funktionen CustomerGateway.cfc hinzufügen.

Schließlich ermöglichen wir Ihnen Funktionen CustomerGateway CFC nur hinzufügen, weil, wenn Sie den Kunden Tabelle ändern (zum Beispiel eine Spalte hinzufügen), müssen Sie die Tabelle neu erstellen, und tha die Customers.cfc und die CustomersGatewayBase.cfc überschreiben. Ihr benutzerdefinierter Code (sofern vorhanden) ist jedoch sicher in der Unterklasse.

Wie auch immer, das könnte ein wenig vom Thema abweichen, aber ich denke, jemand könnte unsere Erfahrung nützlich finden.

Verwandte Themen