1 Copyright 1996-1997 by Axel T. Schreiner. All Rights Reserved. 7 Datenbankzugriff Prinzip Dieser Abschnitt beschäftigt sich mit dem Paket java.sql , das eine SQL-Schnittstelle für Java verkapselt. Java-Programme greifen damit auf Adaptoren zu, die Verbindungen zu kommerziellen Datenbanken wie Oracle, zu relativ frei verfügbaren Datenbanken wie mSQL oder mysql und mit einer Brücke auch zu ODBC-Datenbanken wie Access vereinheitlichen. Der Ausgangspunkt für diesen Abschnitt war ein Artikel von Silke Seehusen und Hans Timmermann. Java Application 1 Java Application 2 JDBC API JDBC DriverManager Driver A Driver B JDBC-Net Bridge JDBC-ODBC Bridge JDBC Driver API Listener ODBC Driver Manager Driver C DBMS W DBMS X Driver D DBMS Y Driver E DBMS Z Das Problem besteht darin, eine Datenbank in Betrieb zu nehmen, einen passenden JDBC-Adaptor zu installieren und dann das System zu testen. Als Datenbanken werden mSQL , mysql und eine ODBC-Quelle betrachtet. Sql ist ein relativ einfaches Programm, mit dem Zugriffe auf beliebige Adaptoren eingerichtet und SQL-Anweisungen ausgeführt werden können. JDBCTest von InterSolv ist eine sehr ansprechende Applikation, mit der Adaptoren getestet und die Umsetzung von Query- und Resultat-Aufgaben in Java-Code analysiert werden können. 2 mSQL mSQL ist ein recht robustes, in Quellen verfügbares SQL-System, das zum Beispiel Universitäten frei benützen dürfen. Es gibt dazu einen JDBC-Adaptor. Unter Linux übersetzt und installiert man mSQL wie in seinen Unterlagen beschrieben. In den Konfigurationsdateien ist folgendes wichtig: /usr/local/Hughes/msql.conf Host_Lookup = False /usr/local/Hughes/msql.acl database=telbook read=* write=* host=* access=local,remote Wenn der Benutzer msql eingerichtet ist und /usr/local/Hughes als HOME hat, startet man als Admin_User den Datenbank-Server und richtet beim ersten Mal eine Datenbank ein: $ su - msql -c ’bin/msql2d’ & Mini SQL Version 2.0.3 Copyright (c) 1993-94 David J. Hughes Copyright (c) 1995-97 Hughes Technologies Pty Ltd. All rights reserved. Loading configuration from ’/usr/local/Hughes/msql.conf’. Server process reconfigured to accept 214 connections. Server running as user ’msql’. Server mode is Read/Write. $ PATH=$PATH:/usr/local/Hughes/bin $ msqladmin create telbook Database "telbook" created. 3 Der mSQL-JDBC Adaptor befindet sich in imaginary.zip. Damit kann man folgendes testen: $ CLASSPATH=.:imaginary.zip; export CLASSPATH $ msql() { > java -Djdbc.drivers=com.imaginary.sql.msql.MsqlDriver Sql "$@" > } $ msql -s Treiber anzeigen drivers: com.imaginary.sql.msql.MsqlDriver com.imaginary.sql.msql.MsqlException: Unknown database "test" $ msql -d telbook -Verbindung testen $ msql -d telbook " > create table telnumbers ( Tabelle anlegen > name text(10) not null, num int not null > )" " > create unique index idx on telnumbers (num)" Schlüssel anlegen create table telnumbers ( name text(10) not null, num int not null ) 1 row(s) affected. create unique index idx on telnumbers (num) 1 row(s) affected. $ msql -d telbook insert into telnumbers values (’axel’, 2483) interaktiv Werte eintragen 1 row(s) affected. insert into telnumbers values (’bernd’, 2534) 1 row(s) affected. select name from telnumbers Row 1: telnumbers.name: axel Row 2: telnumbers.name: bernd select * from telnumbers where num = 2483 Row 1: telnumbers.name: axel telnumbers.num: 2483 abfragen 4 mSQL/Win32 Version 1.0.16 von mSQL wurde über OS/2 zu Win32 portiert und kann ebenfalls mit dem in Java geschriebenen mSQL-JDBC Adaptor betrieben werden. Zur Installation setzt man etwa: install.bat SET SET SET SET SET SET SET MSQL_HOME=e:\apps\msql MSQL_TCP_PORT=1114 SRV_MINERVA_DEBUG= CLI_MINERVA_DEBUG= MSQL_HOST=localhost USER=root EDITOR= msql.acl database=telbook read=* write=* host=* access=local,remote Unter Windows startet man in zwei DOS-Fenstern den Server und richtet beim ersten Mal eine Datenbank ein: > msqld mSQL Server 1.0.16 for Windows NT starting ... Couldn’t open PID file: No such file or directory > msqlsdm create telbook Dann kann man von Windows oder Linux aus folgendes testen: $ msql() { > java -Djdbc.drivers=com.imaginary.sql.msql.MsqlDriver Sql -u jdbc:msql://perky:1114/ "$@" > } $ msql -s -d telbook drivers: com.imaginary.sql.msql.MsqlDriver create table telnumbers ( name char(10), num int primary key ) 1 row(s) affected. insert into telnumbers values (’axel’, 2483) 1 row(s) affected. insert into telnumbers values (’bernd’, 2534) 1 row(s) affected. select * from telnumbers Row 1: telnumbers.name: axel telnumbers.num: 2483 Row 2: telnumbers.name: bernd telnumbers.num: 2534 5 mysql mysql ist ein binär und in Quellen verfügbares SQL-System mit Multi-Threading, das frei benutzt werden darf. Es gibt dazu einen JDBC-Adaptor. Unter Linux installiert man mysql binär aus dem Archiv in /usr/local/mysql. Im Installationsskript kann man einen zusätzlichen Verwalter eintragen: scripts/mysql_install_db INSERT INTO user VALUES (’%’,’axel’,’’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’); Das Installationsskript sollte man als root ausführen; es startet den Server. Man kann den Server auch so starten: $ su root -c ’cd /usr/local/mysql && bin/mysql.server start’ Password: Starting mysqld demon with databases from /usr/local/mysql-3.20.32a-pc-linux-gnu-i586/data In data/host.log entsteht ein ausführliches Protokoll. Beim ersten Mal richtet man eine Datenbank ein: $ PATH=$PATH:/usr/local/mysql/bin $ mysqladmin create telbook Database "telbook" created. Der Adaptor befindet sich in gwe.zip. Damit kann man folgendes testen: $ CLASSPATH=.:gwe.zip; export CLASSPATH $ mysql() { > java -Djdbc.drivers=gwe.sql.gweMysqlDriver Sql -u jdbc:mysql://cindy:3333/ "$@" > } $ mysql -s -d telbook drivers: gwe.sql.gweMysqlDriver create table telnumbers (name varchar(10), num int primary key) java.sql.SQLException: mysql exception: No columns returned. insert into telnumbers values (’axel’, 2483) java.sql.SQLException: mysql exception: No columns returned. insert into telnumbers values(’bernd’, 2534) java.sql.SQLException: mysql exception: No columns returned. select * from telnumbers Row 1: telnumbers.name: axel telnumbers.num: 2483 Row 2: telnumbers.name: bernd telnumbers.num: 2534 6 ODBC ODBC ist ein Standard, der unter Windows verschiedene Datenbanken einheitlich verfügbar macht. Wenn man zum Beispiel Microsoft Access installiert, kann man die ODBC-Schnittstelle (Microsoft Desktop ODBC-Treiber) zusätzlich installieren und dann eine Vielzahl von Tabellen, darunter auch Textdateien, als Datenbanken benützen. Unter Start/Einstellungen/Systemsteuerung findet man 32-Bit-ODBC über Einrichten und Anlegen kann man eine Datenbank als Datenquelle anlegen: 7 Beim JDK (1.1.5) für Windows ist ein Adaptor bereits vorhanden, der zwischen JDBC und ODBC vermittelt. Damit kann man folgendes testen: > set CLASSPATH=. > java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver Sql -s -u jdbc:odbc: -d telbook drivers: sun.jdbc.odbc.JdbcOdbcDriver create table telnumbers (name string, num integer constraint pk primary key) -1 row(s) affected. insert into telnumbers values(’axel’, 2483) 1 row(s) affected. insert into telnumbers values(’bernd’, 2534) 1 row(s) affected. select * from telnumbers Row 1: name: axel num: 2483 Row 2: name: bernd num: 2534 8 JDBCTest JDBCTest ist eine Java-Applikation von InterSolv, mit der man interaktiv alle denkbaren Operationen ausprobieren und den relevanten Java-Code sehen kann.