Weiter Zurück [Inhalt] Online Suche im Handbuch

34.7 Links und Beispiele

Hier ein Class 4 JDBC-Treiber mit Beispielen: http://www.voicenet.com/~zellert/tjFM/, und der entsprechenden Dokumentation dazu: http://www.voicenet.com/~zellert/tjFM/twz1jdbcForMysql-doc.html Klasse 4 JDBC-Treiber kommunizieren ohne Zwischenschicht direkt über JAVA Sockets mit der Datenbank und sind deshalb Plattformunabhängig, lassen sich also mit MAC, Microsoft, LINUX, SUN ....Betriebssystemen starten.

http://doc.trader.dk/mysql/twz-jdbc/jdbc/mysql/docs/twz1jdbcForMysql-doc.html Klasse 3 JDBC-Treiber ist z.B. der JDBC-ODBC-Treiber mit der RMI JAVA Klasse von SUN. Klasse 2 JDBC Treiber, wie z.B. JDBC OCI (Oracle Call Interface) erfordern Treiber auf der Client-Seite und auf der Serverseite.ier noch ein etwas veralteterJDBC Treiber für MySQL....von GWE Technologies.... http://www.gwe.co.uk/java/jdbc/

Ein interessantes Beispiel ist TableGen, ein Tablegenerator für SQL-Datenbanken mit JDBC Klasse 4 Treiber. http://freespace.virgin.net/joe.carter/TableGen/index.html

Brent's JAVA Page ist für Leidensgenossen gedacht, die Beispiele für JAVA und SQL-DAtenbanken suchen. http://www.ewin.org/~bret/java/ Hier ist für fast alle Datenbanken etwas dabei !

Für Entwickler ganz interessant sein dürfte der GIANT JAVA TREE, siehe http://www.gjt.org/doc/, der einen komfortablen Class-Browser (Symantec...) ersetzen kann..... ICE.COM bietet für SQL eine ganze Reihe von Applets mit Quellcode als GPL Freeware an. Hier zeigt sich, was man alles mit JDBC-Treibern und JAVA praktischmachen kann. Hier ein Screenshot es Mail Clients unter Windows NT 4: http://www.ice.com/java/icemail/screen1.html http://www.ice.com/java/sqlclient/

Darüber hinaus gibt es Treiber mit EXTENSIONS, wie z.B. Support für CURSOR, Prefetching von Daten, Caching von Daten u.s.w., die alle die Performance des Datenbank erheblich verbessern können (in der Praxis sieht das schlechter aus). JDBC-ODBC-Treiber sind auf der Site von Pierre Gibello auf http://dyade.inrialpes.fr/mediation/download/RmiJdbc/RmiJdbc.html angeboten. Dieser JDBC Treiber ist mit JAVA RMI von SUN erstellt worden. Siehe hierzu http://java.sun.com/products/jdbc/faq.html Wer sich ausführlich über JDBC-Treiber informieren möchte, der kann auf http://www.retep.org.uk/postgres/ bei dem Entwickler des PostgreSQL JDBC-Treiber, Peter T. Mount umschauen.

Die Site von Ken North ist ebenfalls sehr lesenswert: http://ourworld.compuserve.com/homepages/Ken_North/JDBCVend.htm.

Für Entwickler ist die original SUN JDBC Site vielleicht interessant: http://java.sun.com/products/jdbc/

Hier ein einfaches Beispiel für ein Klasse 3 RMI JDBC-Treiber, der mit allen SQL-Datenbanken, also auch mit MySQL funktioniert. So einfach kann das Leben sein !

import java.sql.*;
import java.net.InetAddress;
/**
 * This is a sample program for RmiJdbc client/server jdbc Driver
 * RmiJdbc relies on Java RMI for jdbc objects distribution
 */
public class rjdemo {

  public static void main(String[] args) {
    try {

      // Register RmiJdbc Driver in jdbc DriverManager
      // On some platforms with some java VMs, newInstance() is necessary...
      Class.forName("RmiJdbc.RJDriver").newInstance();

      // Test with MS Access database (rjdemo ODBC data source)
      String url = "jdbc:odbc:rjdemo";

      // RMI host will point to local host
      String rmiHost = new String(
       "//" + InetAddress.getLocalHost().getHostName());

      // RmiJdbc URL is of the form:
      // jdbc:rmi://<rmiHostName[:port]>/<jdbc-url>

      java.sql.Connection c = DriverManager.getConnection("jdbc:rmi:"
       + rmiHost + "/" + url, "admin", "rjdemo");

      java.sql.Statement st = c.createStatement();
      java.sql.ResultSet rs = st.executeQuery("select * from contact");

      java.sql.ResultSetMetaData md = rs.getMetaData();
      while(rs.next()) {
        System.out.print("\nTUPLE: | ");
        for(int i=1; i<= md.getColumnCount(); i++) {
          System.out.print(rs.getString(i) + " | ");
        }
      }

      rs.close();

    } catch(Exception e) {
      e.printStackTrace();
    }
  }
};
Von George Reese (Imaginary) werden für mSQL, also indirekt auch für MySQL JDBC-Applets mit Quellcodes angeboten, reinschauen lohnt sich auf jeden Fall: http://www.imaginary.com/Java/

Von ihm stammt dieses Gästebuch in JAVA mit mSQL Datenbank auf der Site: http://www.imaginary.com/~borg/GuestBook/GuestBook.html. Hier ein Beispiel von George Reese für die mSQL Anbindung:

import java.sql.*;
public class Select {
    static public void main(String[] args) {
        try {
            String url;
            Connection conn;
            Statement stmt;
            ResultSet rslt;

            url = "jdbc:msql://carthage.imaginary.com:1114/test";
            conn = DriverManager.getConnection(url, "me", "");
            stmt = conn.createStatement();
            rslt = stmt.executeQuery("SELECT * FROM test");
            while( rslt.next() ) {
                System.out.println("ID: " + 
                                   rslt.getInt(1) + "\n"
                                   "Value: " + 
                                   rslt.getString(2));
            }
            conn.close();
        }
        catch( Exception e ) {
        }
    }
}

Dasselbe Beispiel für SYBASE ASE Datenbank unter LINUX. SYBASE für LINUX ist ein kleiner Geheimtip, da SYBASE voll Microsoft SQL kompatibel ist, und auch kostenlos ausgetestet werden kann. Dieses Beispiel ist gegenüber dem oberen ein wenig ergänzt worden, die Parallelen sollten aber deutlich werden...:

/**
 * Generic connection engine,
 */
import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;


public class ConnectExapmple {

        private Connection con = null;
        private Statement s = null;
        
        private Connection connect()
        {
                String dbdriver = "com.sybase.jdbc.SybDriver";
                String dburl = "jdbc:sybase:Tds:10.200.38.232:7100";
                String dbuser = "sa";
                String dbpassword = "";

                try {
                        Class.forName(dbdriver);
                        return DriverManager.getConnection (dburl, dbuser,
dbpassword);
                }
                catch (Exception e) {
                        System.out.println("Can't connect");
                        e.printStackTrace();
                        return null;
                }
        }

        public ResultSet execute(String query)
        {
        
                ResultSet       r;

                try {
                        s = con.createStatement();
                        r = s.executeQuery(query);
                        return r;
                }
                catch (Exception e) {
                        e.printStackTrace();
                        System.exit(1);
                }
                return null;
        }

        public void test() {

                ResultSet r;
                String theQuery = new String("select name from sysobjects
where type='U'");

                try {
                        con = connect();
                        r = execute(theQuery);
                        while (r.next()) {
                                System.out.println(r.getString("name"));
                        }
                        con.close();
                }
                catch (Exception e) {
                        e.printStackTrace();
                }
        }

        public static void main(String args[])
        {
                ConnectExample db = new ConnectExample();

                db.test();
        }
}


Damit diese Beispiele auch laufen, muß man den SUN JAVA-Interpreter und die Klassenbibliotheken auf der Arbeitsstation installiert haben. Im Browser funktionieren die Beispiele auch, siehe das Gästebuch. Wenn man sich die Quellcodes von dem JDBC-Treiber für mSQL genau anschaut, dann fallen einige Unterschiede auf, die sich teilweise recht einfach kompensieren lassen. Dazu gehört z.B. die Standard Portnummer. Andere, wie z.B. die Unterstützung für Hersteller - spezifische Variablentypen müssen im Quellcode des JDBC-Treibers erst angepasst oder implementiert werden. Viele der Routinen, die SUN mit der RMI zur Verfügung stellt, werden von mSQL nicht unterstützt, diese sind nur als void (leer) Routinen implementiert, funktionieren also nicht. Beim Aufruf dieser Routinen wird ein Fehler ausgegeben.

Brian Jepson hat auf seiner Homepage http://users.ids.net/~bjepson/javadb/ zahlreiche Programme zu seinem Buch, JAVA Database Programming veröffentlicht, die zahlreiche Beispiele zur JAVA/JDBC-ODBC-Bridge-Programmierung und SQL Datenbanken enthalten. Darryl Collins hat auf seiner Homepage http://mama.minmet.uq.oz.au/msqljava/ ein paar sehr schöne Anleitungen zum Progammieren eines JAVA-Interface für SQL-Datenbanken (mSQL und MySQL) veröffentlicht, begleitet von ein paar funktionierenden Online-Demos. Ein gebunden wird das JAVA-Applet einfach an einer beliebigen Stelle im HTML-Code:

<applet code="Demo.class" width=400 height=200> </applet>

Dieses Applet wird einfach mit dem SUN JAVAC Compiler kompiliert - fertig !

import java.awt.*;
import java.lang.*;
import java.util.*;

import msql.*;

public class Demo extends java.applet.Applet {

        TableView view;

        public void init() {

                Msql msql;
                MsqlResult date;
 
                try {
                        msql = new Msql();
                        msql.Connect("mama.minmet.uq.oz.au","nobody");
                        msql.SelectDB("demo");
 
                        date = msql.Query(
                                "select * from domain order by Count desc"
                        );
 
                        msql.Close();
 
                        view = new TableView(date);
                        add(view);

                } catch (MsqlException e) {
                        System.out.println(e.getMessage());
                }
        }
}


class TableView extends Panel {

        RowView label;
        String names[];

        RowView row[];
        MsqlResult result;

        Scrollbar rowbar;

        int nCursor;

        TableView(MsqlResult result) {

                int i;

                this.result = result;

                int f = result.NumFields();
                names = new String[f];

                for(i=0; i<f; i++) {
                        String s[] = result._FetchField();
                        names[i] = new String(s[1]);
                }

                label = new RowView(names);

                int n = result.NumRows();
                row = new RowView[5];

                Panel table = new Panel();
                table.setLayout(new GridLayout(5,1,0,0));

                nCursor = 0;

                result.DataSeek(nCursor);
                for(i=0; i<5; i++) {
                        row[i] = new RowView(result.FetchRow());
                        table.add(row[i]);
                }

                rowbar = new Scrollbar();
                rowbar.setValues(0,5,0,n-5);

                setLayout(new BorderLayout());
                add("North",label);
                add("Center",table);
                add("East",rowbar);

        }

        public boolean handleEvent(Event e) {

                int i;

                if(e.target instanceof Scrollbar) {

                        if(e.target == rowbar) {
                                nCursor = rowbar.getValue();

                                result.DataSeek(nCursor);
                                for(i=0; i<5; i++)
                                        row[i].setText(result.FetchRow());
        
                                return true;
                        }
                }

                return false;
        }
}

class RowView extends Panel {

        TextField field[];

        RowView(String s[]) {

                setLayout(new FlowLayout(FlowLayout.LEFT,0,0));

                field = new TextField[s.length];
                int width[] = new int[s.length];

                width[0] = 32;
                width[1] = 8;


                for(int i=0; i<s.length; i++) {
                        field[i] = new TextField(s[i],width[i]);
                        field[i].setEditable(false);
                        add(field[i]);
                }
        }

        public void setText(String s[]) {

                for(int i=0; i<s.length; i++)
                        field[i].setText(s[i]);
        }
}

Wer sich dieses Beispiel live im Internet anschaut, der wird bemerken, daß dieses Beispiel sehr ausbaufähig ist. Cursor, die man schmerzlich bei mSQL und MySQL vermißt, werden hierdurch weitestgehend überflüssig, da das JAVA-Applet Ergebnisse cachen kann. Da hierdurch beim Scrollen keine Serverlast entsteht, kann auch mit vielen Clients gleichzeitig auf mSQL oder MySQL zugegriffen werden. Allerdings bietet die SWING-Klassenbibliothek wesentlich mehr Programmierkomfort, als die älteren AWT-Klassen.


Weiter Zurück [Inhalt] Online Suche im Handbuch