Showing posts with label Derby. Show all posts
Showing posts with label Derby. Show all posts

Sunday, February 17, 2013

Notes ist eine relationale Datenbank!

Natürlich ist der Standardspeicher NSF von Notes nach wie vor keine relationale Datenbank und auch NSFDB2 ist schon lange kein Thema mehr. Jedoch gibt es seit der Version 8 gut versteckt im Expeditor Framework eine leichtgewichtige aber nicht desto trotz sehr leistungsfähige relationale Datenbank (Apache Derby) die über eine umfangreiche SQL Unterstützung verfügt. Diese Datenbank ist sehr praktisch, wenn man Daten lokal in einer relationalen Form ablegen will. Ein Beispiel wäre man will ein Plugin, dass normalerweise nur mit einem SQL Server funktioniert offline fähig machen. Man kann aber auch Daten aus einer NSF in die Derby Datenbank kopieren und dort dann mit SQL Auswertugen über die Daten machen die mit der Notes API nur schwer oder beinahe unmöglich sind.

Wie kann man nun Apache Derby aus einem Plugin ansprechen? Als erste muss man das Derby Plugin zu den Abhängigkeiten seines Plugins hinzufügen.


Dann kann man auch schon von seinem Code auf Apache Derby zugreifen. Der folgende Code erstellt eine Datenbank mit dem Namen testDB mit einer Mitarbeitertabelle die mit ein paar Namen befüllt wird. Nachher kommt ein Query auf die neu erstellten Daten das Ergebnis wird in eine Messagebox ausgegeben. Natürlich nicht sehr sinnvoll, aber es zeigt alle notwendigen Befehle die man für die Verwendung von Derby braucht. Natürlich wird man die Initialisierung und Erstellung der Datenbank in eine eigenes Plugin auslagern, aus denen sich dann alle Plugins die Derby verwenden wollen die Connection holen. Ebenso sollte man die stmt.execute in einer Echtanwendung durch PreparedStatements ersetzen.


try {
    // Derby Datenbankverzeichnis in das Datenverzeichnis des Plugins
    // legen.
 // Dies sollte natürlich immer das gleiche sein und am besten in ein
 // Initialisierungsplugin verlegt werden.
 System.setProperty("derby.system.home", Activator.getDefault()
   .getStateLocation().toFile().getAbsolutePath());
 // Treiber für Apache Derby laden.
 Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
 // Eine Konnection zu Apache Derby erstellen und bei Bedarf die
 // Datenbank testDB erstellen.
 Connection con = DriverManager
   .getConnection("jdbc:derby:testDB;create=true");
 // Ein SQLStatement Objekt erstellen.
 Statement stmt = con.createStatement();
 // Eine Tabelle in der Datenbank erstellen.
 stmt.execute("create table mitarbeiter (name1 varchar(30), name2 varchar(30), department varchar(30))");
 // Ein paar Sätze hinzufügen.
 stmt.execute("insert into mitarbeiter values('Ralf','Petter','IT')");
 stmt.execute("insert into mitarbeiter values('Max', 'Mustermann','IT')");
 stmt.execute("insert into mitarbeiter values('Lieschen', 'Müller','Sales')");
 // Ein Query auf die Datenbank absetzen.
 ResultSet rs = stmt
   .executeQuery("Select * from mitarbeiter where department='IT'");
 // Ergebnis verarbeiten und als Messagebox anzeigen.
 StringBuilder result = new StringBuilder();
 while (rs.next()) {
  result.append((rs.getString("name1").trim() + " "
    + rs.getString("name2").trim() + "\n"));
 }
 MessageBox box = new MessageBox(PlatformUI.getWorkbench()
   .getActiveWorkbenchWindow().getShell());
 box.setMessage(result.toString());
 box.open();
 // Mitarbeiter Tabelle wieder löschen.
 stmt.execute("Drop table mitarbeiter");
 // Derby wieder herunterfahren.
 DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (Exception e) {
 e.printStackTrace();
}

Eine SQL Datenbank kann in vielen Projekten sehr nützlich sein und mit dem Notesclient hat man eine sehr leistungsfähige immer bei der Hand.
ad