Um in Java auf Datenbanken zuzugreifen, verwendet man in der Regel JDBC Treiber, die vom Datenbank-Hersteller zur Verfügung gestellt werden. Im Falle von Microsofts Access Datenbanken hat man jedoch schlechte Karten, da Microsoft selbst keinen JDBC Treiber anbietet. Um trotzdem auf MS Access Datenken zuzugreifen, gibt es einige JDBC Treiber, die über ODBC auf die Access Datenbank zugreifen. Diese Möglichkeit besteht aber nur unter Windows Systemen. Wer unter Linux arbeitet, kann diese Möglichkeit also auch nicht nutzen.
Diese Lücke schließt aber die Java Bibliothek Jackcess, mit der unabhängig vom Betriebsystem auf MS Access Datenbanken zugegriffen werden kann. Der Zugriff erfolgt hier nicht über JDBC sondern über die Klassen und Methoden von Jackcess.
Hier nun einige Kommentare zum Umgang mit Jackcess:
Langsames Schreiben beschleunigen
Beim Schreiben in eine große Datenbanktabelle hatte bei mir das Einfügen einer neuen Zeile mehr als 30 Sekunden gedauert. Das liegt daran, dass Jackcess den Schreibvorgang so optimiert, dass beim Absturz der Anwendung möglichst wenig Daten verloren gehen. Wenn man darauf nicht angewiesen ist, kann man diese Optimierung jedoch auch ausschalten. Dazu öffnet man die Datenbank mit folgenden Parametern:
Database.open("database.mdb", "false", "false");
Das zweite Variable, die übergeben wird, steuert, dass die Datenbank nicht im “readOnly” Zugriff geöffnet wird. Die dritte Variable schaltet dann die Option “autoSync” aus, wodurch das Schreiben bei mir stark beschleunigt wurde.
Long Integer als Primary Key
Primärschlüssel werden durch Jackcess normalerweise automatisch hochgezählt. Dies funktioniert aber nur, wenn die Spalte den Typ “Integer” hat. Die Datenbank, die ich schreiben musste, hatte jedoch den Spaltentyp “Long Integer”. Jackcess hat hier das Schreiben immer mit einer Exception abgebrochen.
Abhilfe schafft die Option setUseBixIndex(), mit der auch in “Long Integer” Spalten geschrieben werden kann.
Database db = new Database("database.mdb");
db.setUseBigIndex(true);
Das Verwenden dieser Option hatte jedoch zur Folge, dass der Primary Key nicht mehr automatisch vergeben wurde. Hier habe ich keine andere Möglichkeit gefunden als selbst den höchsten Wert der Spalte zu ermitteln und dann 1 zu addieren.
Lesen der Datenbank
Bei den Code-Beispielen auf der Jackcess Seite fehlt das Lesen, deshalb hier eine kurzes Code-Beispiel:
Table myTable = db.getTable("myTable");
Iterator<Map<String, Object>> it = myTable.iterator();
while (it.hasNext()) {
Map<String, Object> map = it.next();
String column = map.get("columnName").toString();
//...
}
Zuerst wählt man die Tabelle aus, die gelesen werden soll. Das Objekt vom Typ Table stellt einen Iterator zur Verfügung, mit dem die Tabelle durchlaufen werden kann. Der Iterator gibt für jede Spalte eine Map zurück, über die der Zugriff auf die einzelnen Spalten der Zeile möglich ist.
Weitere Informationen gibt es in den Apidocs.