Die SQL Tag Bibliothek

Wir haben uns verirrt, kommen aber gut voran.
Tom DeMarco

 

Mit der SQL Tag Library wird die Möglichkeit geschaffen, direkt in JSPs auf Datenbanken zuzugreifen. Es ist allerdings schon sehr merkwürdig, dass diese Bibliothek den Weg in die JSTL geschafft hat. Da wurde bisher immer wieder von MVC also Möglichkeit eines sauberen Designs mit einer Trennung von Darstellungsschicht, Modell und Businesslogik betont, aber hier das direkte Durchgreifen über alle Schichtgrenzen hinweg auf eine Datenbank erlaubt. Ich lasse dies hier einfach im Raum stehen.  Ich stelle hier nur die die einzelnen Taghandler mit den wichtigen Attributen vor:

SQL Tag Bedeutung
transaction Stellt eine DB Transaktion bereit
query Führt eine Datenbank-Abfrage durch (SELECT etc.)
update Für Änderungsanfragen an die Datenbank aus (INSERT, UPDATE, DELETE)
param Setzt einen Abfrageparameter auf den angegebenen Wert
dateParam Setzt Datums- und/oder Zeitparameter auf den angegebenen Wert. Der Wert muss vom Typ java.util.Date sein
setdataSource Legt ein javax.sql.DataSource Objekt in einer Variablen ab. Im Prinzip eine Connection.

<sql:transaction>

Attribut Pflichtfeld Bedeutung
dataSource nein Gibt die DataSource an, die verwendet werden soll. Es können hier auch JNDI Bezeichnungen als Strings übergeben werden um auf einen Connection Pool zu verweisen.
isolation nein Der gewünschte Isolationslevel. Wenn dieser leer gelassen wird, ist es der standardmäßig für diese Datenquelle definierte. Mögliche Werte sind „read_uncommitted“, „read_committed“, „repeatable_read“ und „serializable“

Dieses Tag bildet eine Transaktion für <sql:query> oder<sql:update> -Tags.

<sql:query>

Attribut Pflichtfeld Bedeutung
var ja Der Variablen Name, quasi das Resultset unter dem das Ergebnis der SQL-Abfrage abgelegt werden soll
scope nein Der gewünschte Gültigkeitsbereich für die unter dem Attribut „var“ angegebene Variable
dataSource nein Gibt die Data Source an, die verwendet werden soll in Form einer JDBC Url. Es kann auch wie oben Beschrieben eine JNDI Bezeichnung mit Ziel eines Connection Pools als String angegeben werden.
sql nein Das abzusetzende Statement. Es kann auch im Body des Tags angegeben werden.
startRow nein Gibt die erste gewünschte Zeile des Abfrageergebnisses. Für eine Darstellung die Seitenweise die Menge der Abfrageergebnisse darstellt.
maxRows nein Die maximale Anzahl der Ergebnisse, die die Abfrage liefern soll. Auch hier gilt die Überlegung das Daten Seitenweise dargestellt werden können.

Dieses Tag wird für Abfragen an die Datenbank genutzt. Das Ergebnis wird in einem Objekt vom Typ javax.servlet.jsp.jstl.sql.Result abgelegt. Der Name, unter dem dieses Objekt abgelegt werden soll, bildet das wichtige Pflicht-Attribut des Tags.

<sql:update>

Attribut Pflichtfeld Bedeutung
var nein Der Name, unter dem das Ergebnis der SQL-Abfrage abgelegt werden soll. Das Ergebnis ist vom Typ java.lang.Integer und gibt die Anzahl der veränderten bzw. neu hinzugefügten Reihen in der veränderten Tabelle an
scope nein Der Gültigkeitsbereich für die unter dem Attribut „var“ angegebene Variable.
dataSource nein Gibt die Data Source an, die verwendet werden soll. Dies muss entweder eine Variable vom Typ Data Source sein oder ein String, der einen JNDI-Pfad oder die JDBC-DriverManager-Parameter enthält.
sql nein Das abzusetzende Statement. Wird dieses Attribut nicht genutzt, so ist der Body des Tags für das gewünschte SQL-Statement zu nutzen

Das Update Tag nimmt Veränderungen an der DB vor. Auch wenn der Tag <sql:update> lautet, kann dieser Taghandler neben dem UPDATE Statements auch für INSERT- und DELETE Statements genutzt werden.

<sql:param>

Attribut Pflichtfeld Bedeutung
value nein Der gewünschte Wert für den Parameter

Die <sql:update>- und <sql:insert>-Tags können wie ein Prepared Statements Parameter annehmen. Dabei spielt die Reihenfolge beim jeweiligen SQL-Statement, wie auch bei der normalen Java Programmierung ein wichtige Rolle. Der gewünschte Wert kann sowohl im „value“-Attribut oder im Body des Tags angegeben werden.

<sql:dateParam>

Attribut Pflichtfeld Bedeutung
value ja Der gewünschte Wert für den Parameter
type nein Der Typ des Attributs. Kann „date“, „time“ oder „timestamp“ sein

Mit dem <sql:param>-Tag kann man dem Statement bspw. Zahlen oder String-Parameter hinzufügen. Für Datumswerte muss hingegen dieser Tag verwendet werden. Der Wert des Parameter muss – im Unterschied zum <sql:param>-Tag – zwingend im „value“-Attribut angegeben werden.

<sql:setDataSource>

Attribut Pflichtfeld Bedeutung
var nein Der Name, unter dem die Datasource-Variable abgelegt werden soll. Wird dieser nicht angegeben, wird die Datenquelle unter dem Namen „javax.servlet.jsp.jstl.sql.dataSource“ abgelegt
scope nein Der gewünschte Gültigkeitsbereich für die unter dem Attribut „var“ angegebene DataSource
dataSource nein Gibt die DataSource an, die verwendet werden soll. Dies muss entweder eine Variable vom Typ Datasource sein oder ein String, der einen JNDI-Pfad oder die JDBC-DriverManager-Parameter enthält.
driver nein Der Name des zu verwendenden JDBC-Drivers
url nein Die jdbc URL, unter der die DB erreichbar ist
user nein Der Loginname, der für die DB-Zugriffe verwendet wird
password nein Das passende Passwort zum verwendeten Loginnamen

Dieses Tag legt fest, gegen welche Datenbank  die Abfragen gehen sollen. Das Attribut „dataSource“  enthält . Zunächst einmal kann dieses Attribut ein Objekt vom Typ javax.sql.DataSource entgegen nehmen. Alternativ kann man einen String angeben. Dieser kann entweder ein relativer Pfad auf eine JNDI-Ressource sein oder eine kompakte Form der anderen Driver spezifischen Attribute dieses Tags.
Nutzt man den gerade beschriebenen DataSource-String oder die JDBC-relevanten Parameter, so wird ein java.sql.DriverManager-Objekt erzeugt, das keinerlei Connection-Pooling-Fähigkeiten mitbringt. Bei produktiven Anwendungen sollte immer mittels des JNDI-Pfads auf eine im Container konfigurierten Connection Pool(DataSource) zugegriffen werden.

Ein praktisches Beispiel für ein lesenden Datenbankzugriff. Es wird hier auf die Beispieldatenbank Sample, die bei einer Netbeans Installation immer mit installiert wird, zugegriffen. Ganz genau auf die Tabelle Customer.


 

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSTL-SQL - Example</title>
  </head>
<body>
       <sql:setDataSource driver="org.apache.derby.jdbc.ClientDriver" 
                          url="jdbc:derby://localhost:1527/sample"
                          user="app"
                          password="app"
                          var="con"
                          scope="request" />
       <sql:query dataSource="${con}"
                  var="result"
                  maxRows="10"
                  startRow="0"
                  sql="Select * from customer" />
 <table>
  <tr>
   <c:forEach items="${result.columnNames}" var="column">
      <th style="border: 1px solid #000000; padding: 5px;">${column}</th>
   </c:forEach>
  </tr>
    <c:forEach items="${result.rows}" var="currRow">
  <tr>
    <c:forEach items="${result.columnNames}" var="column">
       <td style="border: 1px solid #000000; padding: 5px;" >${currRow[column]}</td>
    </c:forEach>
  </tr>
    </c:forEach>

  </table>
</body>
</html>

 

0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.