| |
|
SOFTWARE |
|
|
|
|
|
II-17. Programmierbeispiel: Datenbank-Tabelle anzeigen
Informationen zu SQL finden Sie in sql.htm,
mysql.htm
und postgresql.htm.
Informationen zur Anbindung von SQL-Datenbanken unter Java mit JDBC
finden Sie in java-sql.htm.
Im Folgenden wird eine JSP-Datei beschrieben, in der sowohl das
Eingabe-Formular ('<form ...') als auch der die Ergebnisse
auswertende und darstellende Code ('out.println(rs.getString())')zusammen in einer Datei stehen.
Das Source-Code-Beispiel ist funktionsfähig, aber ohneFehlerbehandlung.
Falls die gelesenen Daten nicht sofort ausgegeben werden (wie imBeispiel mit 'out.println()'), sondern zu einem langen Stringaddiert werden sollen, darf dies nicht durch Addition von Stringsmit dem '+'-Zeichen erfolgen, sondern muss mit StringBuffer.append()geschehen, da sonst enorm viele Ressourcen und Zeit verbrauchtwerden.
Falls die Datenbank-Verbindung von mehreren Threads benutzt werdenkann, müssen alle entsprechenden Funktionen Thread-sicher gemachtwerden, z.B. mit 'synchronized' oder mit '<%@ pageisThreadSafe="false" %>'.
Beachtet werden muss, dass bei SQL die erste Spalte mit 1 statt 0indiziert wird (siehe ResultSet.getString() und getColumnName()).
Außerdem muss beachtet werden, dass zwar mehrere Statementsgleichzeitig geöffnet sein können, aber innerhalb eines Statements (hier: 'st') zu jedem Zeitpunkt immer nur höchstens ein ResultSet
('rs') offen sein darf.
Das ResultSet muss nach Gebrauch unbedingt geschlossen werden
('rs.close()').
Das geöffnete Statement ('st') muss nicht unbedingt geschlossen
werden ('st.close()'), die Entsorgung kann der Java Garbage
Collection überlassen werden. Allerdings kann es einen
Datenbank-Fehler auf Grund zu vieler geöffneter Cursor geben, wenn
viele Statements geöffnet werden, bevor die Garbage Collection die
vorherigen schließen konnte.
Für höhere Performance sollte kein ODBC-Treiber, sondern möglichst
ein direkter zur Datenbank passender JDBC-Type-4-Treiber verwendet
werden.
Der JDBC-Treiber muss entweder in das Verzeichnis
%JAVA_HOME%\jre\lib\ext kopiert werden, dann braucht er nicht dem
CLASSPATH hinzugefügt werden, oder er wird in ein anderes
Verzeichnis kopiert und muss im CLASSPATH eingetragen werden (Pfad
plus Dateiname).
Genaueres hierzu finden Sie in java-sql.htm.
Mögliche Beispiele für JDBC-Type-4-Treiber und die Strings sDbDrv
und sDbUrl für die Datenbanken MySQL, PostgreSQL und
Oracle:
|
JDBC-Type-4-Treiber |
sDbDrv
sDbUrl |
MySQL |
mm.mysql-2.0.2-bin.jar |
org.gjt.mm.mysql.Driver
jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName |
PostgreSQL |
pgjdbc2.jar |
org.postgresql.Driver
jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName |
Oracle |
classes12.zip |
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL |
<html>
<body>
<%@ page import = "java.sql.*" isThreadSafe="false" %>
<%
String sDbDrv = "org.gjt.mm.mysql.Driver";
String sDbUrl = "jdbc:mysql://localhost:3306/test";
String sUsr = "";
String sPwd = "";
String sTable = "TestTabelle";
String sSql = "";
if( request.getParameterNames().hasMoreElements() == true )
{
sDbDrv = request.getParameter( "prmDbDrv" );
sDbUrl = request.getParameter( "prmDbUrl" );
sUsr = request.getParameter( "prmUsr" );
sPwd = request.getParameter( "prmPwd" );
sTable = request.getParameter( "prmTab" );
sSql = request.getParameter( "prmSql" );
if( null != sTable && 0 < sTable.length() &&
(null == sSql || 0 == sSql.length()) )
sSql = "SELECT * FROM " + sTable;
}
%>
<form method="post"><pre>
Db-Treiber <input type="text" name="prmDbDrv" value='<%= sDbDrv %>' size=60><br>
Db-URL <input type="text" name="prmDbUrl" value='<%= sDbUrl %>' size=60><br>
Benutzer <input type="text" name="prmUsr" value='<%= sUsr %>' size=60><br>
Kennwort <input type="password" name="prmPwd" value='<%= sPwd %>' size=60><br>
Tabellenname <input type="text" name="prmTab" value='<%= sTable %>' size=60><br>
SQL-Kommando <input type="text" name="prmSql" value='<%= sSql %>' size=60>
(nach Änderung anderer Parameter muss SQL-Kommando gelöscht werden)<br>
<input type="submit" name="submit" value="Datenbanktabelle anzeigen">
</pre></form>
<%
if( request.getParameterNames().hasMoreElements() == true
&& null != sDbDrv && 0 < sDbDrv.length()
&& null != sDbUrl && 0 < sDbUrl.length()
&& null != sSql && 0 < sSql.length() )
{
Class.forName( sDbDrv );
Connection cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
java.sql.Statement st = cn.createStatement();
ResultSet rs = st.executeQuery( sSql );
ResultSetMetaData rsmd = rs.getMetaData();
int n = rsmd.getColumnCount();
out.println( "<table border=1 cellspacing=0><tr>" );
for( int i=1; i<=n; i++ ) // Achtung: erste Spalte mit 1 statt 0
out.println( "<th>" + rsmd.getColumnName( i ) + "</th>" );
while( rs.next() )
{
out.println( "</tr><tr>" );
for( int i=1; i<=n; i++ ) // Achtung: erste Spalte mit 1 statt 0
out.println( "<td>" + rs.getString( i ) + "</td>" );
}
out.println( "</tr></table>" );
rs.close();
st.close();
cn.close();
}
%>
</body>
</html>
|
|
|
|
|
|
|