Voor ingebedde SQL (zoals in C of COBOL) en SQLJ (een Java-extensie) zijn precompilers nodig omdat ze SQL-instructies *binnen* de broncode van de hosttaal rechtstreeks insluiten. JDBC daarentegen behandelt SQL als gegevens die aan een database worden doorgegeven; het is niet verweven met de Java-code zelf.
Dit is de reden waarom een precompiler nodig is voor de ingebedde benaderingen, maar niet voor JDBC:
* Code-integratie en -compilatie: Ingebedde SQL- en SQLJ-instructies worden niet begrepen door standaard C-, COBOL- of Java-compilers. De taak van de precompiler is om:
* Ontleed de SQL: Het analyseert de ingebedde SQL-instructies, controleert de syntaxis en valideert database-interacties.
* Genereer hosttaalcode: Het vertaalt deze SQL-instructies in aanroepen naar de API van een databasestuurprogramma (of gelijkwaardige databasetoegangsmechanismen op laag niveau). Dit genereert code in de hosttaal die communiceert met de database, de verbinding afhandelt, de uitvoering van query's en het ophalen van resultaten.
* Combineren met hosttaalcode: De precompiler weeft deze gegenereerde code terug in de broncode van het hostprogramma, waardoor een compleet programma ontstaat dat klaar is voor standaardcompilatie.
* Gegevenstypetoewijzing: De precompiler verzorgt de mapping tussen de gegevenstypen van de hosttaal en de gegevenstypen van de database. Dit is van cruciaal belang omdat de hosttaal en de database verschillende representaties kunnen gebruiken voor getallen, tekenreeksen, datums, enz.
* Dynamische SQL-verwerking: Als de ingebedde SQL dynamische SQL gebruikt (SQL-instructies gebouwd tijdens runtime), moet de precompiler de juiste code genereren om de constructie en uitvoering van deze dynamisch gegenereerde query's af te handelen.
De andere aanpak van JDBC:
JDBC gebruikt een compleet andere architectuur. SQL-instructies worden binnen de Java-code behandeld als tekenreeksen. Het JDBC-stuurprogramma zorgt voor de vertaling en uitvoering van deze tekenreeksen. Er is geen precompilatie nodig omdat:
* Runtime-uitvoering: De SQL wordt *tijdens runtime* naar de database verzonden. Het JDBC-stuurprogramma zorgt voor het parseren en uitvoeren van de SQL-instructies.
* String-gebaseerde SQL: SQL wordt doorgegeven als een string; de Java-compiler heeft geen speciale kennis van SQL-syntaxis nodig.
* Verantwoordelijkheid van de bestuurder: De chauffeur is verantwoordelijk voor alle communicatie met de database, inclusief typetoewijzing en foutafhandeling.
In wezen vereisen embedded SQL en SQLJ dat precompilers de kloof tussen de hosttaal en de database tijdens het compileren overbruggen, terwijl JDBC deze overbrugging tijdens runtime afhandelt met behulp van een stuurprogramma. Dit maakt JDBC flexibeler en draagbaarder, maar in sommige gevallen mogelijk minder efficiënt dan de strak geïntegreerde aanpak van embedded SQL en SQLJ. |