Eingebettete SQL (wie in C oder COBOL) und SQLJ (eine Java -Erweiterung) erfordern Vorkompiloren, da sie direkt SQL -Anweisungen * in * in * dem Quellcode der Host -Sprache einbinden. JDBC dagegen behandelt SQL als Daten, die an eine Datenbank übergeben wurden. Es ist nicht mit dem Java -Code selbst verwoben.
Hier ist der Grund, warum ein Präkompiler für die eingebetteten Ansätze benötigt wird, jedoch nicht für JDBC:
* Code -Integration und -Compilation: Eingebettete SQL- und SQLJ -Anweisungen werden von Standard -C-, COBOL- oder JAVA -Compilern nicht verstanden. Die Aufgabe des Vorkompilers ist zu:
* SQL analysieren: Es analysiert die eingebetteten SQL -Anweisungen, überprüft die Syntax und die Validierung von Datenbankinteraktionen.
* Hostsprachcode generieren: Es übersetzt diese SQL-Anweisungen in Aufrufe in eine Datenbank-Treiber-API (oder gleichwertige Datenbankzugriffsmechanismen auf niedriger Ebene). Dies generiert Host-Sprachcode, der mit der Datenbank, der Bearbeitung von Verbindungen, Abfrageausführung und Ergebnisabruf interagiert.
* Kombinieren Sie mit Host -Sprachcode: Der Precompiler webt diesen generierten Code wieder in den Quellcode des Host -Programms zurück und erstellt ein vollständiges Programm, das für die Standardkompilierung bereit ist.
* Datentyp -Mapping: Der Präkompiler kümmert sich um die Zuordnung zwischen den Datentypen der Host -Sprache und den Datentypen der Datenbank. Dies ist entscheidend, da die Host -Sprache und die Datenbank unterschiedliche Darstellungen für Zahlen, Zeichenfolgen, Daten usw. verwenden könnten.
* Dynamisches SQL -Handling: Wenn der eingebettete SQL dynamische SQL (SQL -Anweisungen zur Laufzeit) verwendet, muss der Vorkompiler einen geeigneten Code generieren, um die Konstruktion und Ausführung dieser dynamisch generierten Abfragen zu verarbeiten.
JDBCs anderer Ansatz:
JDBC verwendet eine völlig andere Architektur. SQL -Anweisungen werden als Zeichenfolgen im Java -Code behandelt. Der JDBC -Treiber behandelt die Übersetzung und Ausführung dieser Saiten. Es ist keine Vorkompilierung erforderlich, weil:
* Laufzeitausführung: Der SQL wird zur Laufzeit *an die Datenbank *gesendet. Der JDBC -Treiber kümmert sich um die Parsen und Ausführung der SQL -Anweisungen.
* String-basierte SQL: SQL wird als Zeichenfolge übergeben; Der Java -Compiler benötigt kein besonderes Wissen über die SQL -Syntax.
* Treiberverantwortung: Der Treiber ist für die gesamte Kommunikation mit der Datenbank verantwortlich, einschließlich Typ -Mapping und Fehlerbehandlung.
Im Wesentlichen verlangen eingebettete SQL und SQLJ vor Vorkompilern, um die Lücke zwischen der Hostsprache und der Datenbank zum Kompilieren zu überbrücken, während JDBC diese Überbrückung zur Laufzeit mit einem Treiber übernimmt. Dies macht JDBC flexibler und tragbarer, aber in einigen Fällen möglicherweise weniger effizienter als der eng integrierte Ansatz von eingebettetem SQL und SQLJ.