Java HSQLDB (HyperSQL) Tutorial

Nicht immer ist es notwendig, eine installierte Version eines relationalen Datenbanksystems wie beispielsweise MySQL, MSSQL oder sogar einen Oracle Datenbankserver bei der Softwareentwicklung vorliegen zu haben. Nicht selten ist es vollkommen ausreichend, ein eingebettetes Datenbanksystem in der Applikation zu verwenden.
Thomas Müller hat einst die HSQLDB in Java entwickelt. Sie ist frei erhältlich und unterliegt der BSD-Lizenz. Im Gegensatz zu einer MySQL Datenbank kann eine HSQL Datenbank sowohl als eingebettetes Datenbanksystem wie auch als Netzwerkserver verwendet werden. Erstaunlicherweise übersteigt das benötigte .jar File nicht die Größe von 1 Megabyte. Wird die HSQLDB als eingebetteter Datenbankserver genutzt, muss lediglich die Treiberklasse geladen werden.

Zunächst wird die aktuellste Version der HyperSQL Datenbank für das Tutorial benötigt. Dies ist stets auf der Entwicklerwebsite http://hsqldb.org/ zu finden. Ist die aktuellste Version (in diesem Fall hsqldb-2.0.0) heruntergeladen und entpackt, findet sich in dem lib Verzeichnis die benötigte Treiberklasse hsqldb.jar wieder.

[ad#co-3]

Vorbereitung

Bei der hier vorgestellten Umsetzung wird die Eclipse IDE als Entwicklungsumgebung genutzt.

  1. Neues Projekt erstellen
  2. Paket erstellen: de.michel.database.hsqldb
  3. Klasse MyFirstHsqlConnection.java erstellen

HSQLDB dem Classpath hinzufügen

Bevor auf die HSQLDB zugegriffen werden kann, muss vorab die Treiberklasse dem Classpath hinzugefügt werden.

  • Project Properties (Rechtsklick auf das Projekt > Properties)
  • Java Build Path
  • Libraries
  • Add External JARs…
  • hsqldb.jar hinzufügen

run ConnectionDialogSwing

Um die HyperSQL Datenbank zu testen, führen wir eine in der Treiberklasse mitgelieferte Klasse aus. ConnectionDialogSwing.class. Dazu wird eine neue Run-Configuration unter Run > Run Configurations … erstellt. Um eine neue Java-Application anzulegen genügt ein Rechtsklick auf Java-Application > New. Also Projekt wird das zuvor angelegte MyFirstHsqlQuery Projekt ausgewählt. Die Main class hat den Pfad org.hsqldb.util.DatabaseManagerSwing. Der Name kann beliebig gewählt werden. Weitere Einstellungen sind für das Ausführen durch den Run Button nicht notwendig.

HSQLDB Settings

In dem Database Manager sind nun einige Einstellungen zu verwalten.

  • Recent Settings: HSQL Database Engine
  • Setting Name: HSQL Database Engine (Name beliebig wählbar)
  • Type: HSQL Database Engine Standalone
  • Driver: org.hsqldb.jdbcDriver
  • jdbc:hsqldb:file:home/simon/trash/hsql (frei wählbar ab file:)
  • User: root (frei wählbar)
  • Passwort: (frei wählbar)

Test Script

Um die Einstellungen zu testen, unterliegt dem Menü Command die Option Test Script. Ein paar Zeilen SQL werden anschließend der Konsole übergeben, welche anschließend mit Execute SQL ausgeführt werden kann. Das Ergebnis ist im nachfolgendem Screenshot veranschaulicht.

Insert test data

Um die Datenbank mit Dummy-Daten zu füllen genügt der Aufruf Options > Insert test data. Das Ausführen der SELECT Abfrage ergibt folgendes Ergebnis:

Wichtig:Zum Schließen des SwingManagers muss darauf geachtet werden, dass das Programm ordnungsgemäß über File > Exit geschlossen wird, da ansonsten die Testdaten nicht persistiert werden und die nachfolgende SQL Abfrage in eine Exception verläuft.

MyFirstHsqlConnection.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MyFirstHsqlConnection
{
	public MyFirstHsqlConnection()
	{
		 
    try 
    { 
    	// Treiberklasse laden
      Class.forName( "org.hsqldb.jdbcDriver" ); 
    } 
    catch ( ClassNotFoundException e ) 
    { 
      System.err.println( "Treiberklasse nicht gefunden!" ); 
      return; 
    } 
 
    Connection con = null; 
 
    try 
    { 
      con = DriverManager.getConnection(  
              "jdbc:hsqldb:file:home/simon/trash/hsql; shutdown=true", "root", "" ); 
      Statement stmt = con.createStatement(); 
 
      // Alle Kunden ausgeben
      String sql = "SELECT * FROM Customer";
      ResultSet rs = stmt.executeQuery(sql); 
 
      while ( rs.next() ) 
      {
      	String id = rs.getString(1);
      	String firstName = rs.getString(2);
      	String lastName = rs.getString(3);
      	System.out.println(id + ", " + firstName + " " + lastName);
      }
      
      // Resultset schließen
      rs.close(); 
 
      // Statement schließen
      stmt.close(); 
    } 
    catch ( SQLException e ) 
    { 
      e.printStackTrace(); 
    } 
    finally 
    { 
      if ( con != null ) 
      {
      	try { 
      		con.close(); 
    		} catch ( SQLException e ) { 
    			e.printStackTrace(); 
  			}
      }
    } 
	}
	
	public static void main(String[] args)
	{
		new MyFirstHsqlConnection();
	}
}

Ergebnis

Als Ergebnis werden wie erwartet die Namen der einzelnen Kunden in der Konsole ausgegeben.

0, Laura Steel
1, Robert King
2, Robert Sommer
3, Michael Smith
4, Bill Fuller
5, Laura White
6, Robert King
7, Susanne Clancy
8, Bob Heiniger
9, Robert Ott
10, Anne Smith
...