JSDatаBase (JAVA SIMPLE DATA BASE V.1.0) Vorwort Diese Bibliothek ist ein mit JAVA (JavaSE-1.6) realisiertes Datenbanksystem für die Speicherung und die Verwaltung von Daten. Sehr oft schreibt man Programme, die die Daten ablegen oder bereitstellen sollen und nicht nur ein paar Sätze, sondern auch riesige Datenmengen, wie zum Beispiel ein Telefonbuch. Ich selbst habe schon mehrere Male Probleme gehabt, welche man einfach ohne die Datenbank nicht realisieren kann, z.B.: NotenBank v 1.0 unter der Adresse (http://atoks.bplaced.net/index.php?action=soft&top=7&lang=de) und mehrere andere. Manche werden sich bestimmt fragen „Wozu noch mal ein Fahrrad entdecken? Es gibt schon Haufen von Datenbanken, die bereits geschrieben sind, um diese Probleme zu lösen.“ Und ich bin damit einverstanden. Aber ich hatte eine Situation, in der eine Datenbank benutzt werden sollte, welche gewisse Ähnlichkeiten zu MySQL hat, aber keine Server dazu braucht. Deswegen habe ich mich mit diesem Problem auseinander gesetzt und diese Datenbank geschrieben, die das Ablegen großer Mengen von Daten in eine Datei und auch deren Nutzung von dort aus ermöglicht. Dazu ist es komplett KOSTENLOS und ist zu einer ganz guten Sache geworden. Ich habe diese Datenbank schon in drei Projekten benutzt und habe noch keine Probleme entdeckt, läuft einwandfrei. Deswegen möchte ich diese Datenbank mit anderen teilen, vielleicht findet es jemand hilfreich. Vorteile, die ich rausgefunden habe ☺ + ERSTE UND GROESSTE KOSTENLOS + Funktioniert lokal auf dem Rechner + Braucht keine zusätzlichen Installationen, vor welchen meistens die User „Angst“ haben + Sehr einfach zu bedienen + Nimmt wenig Speicherplatz weg + Ziemlich schnell bei 1000000 Datensätzen; fast genau so schnell wie MySQL + Auf Grund das diese Datenbank komplett unter JAVA geschrieben ist, soll es plattformunabhängig sein, aber ich habe es nur unter Windows getestet. + es gibt eine Deutsche Dokumentation Beschreibung (Stand-Alone-Database) Datenbank für Speicherung und Verwaltung von Daten auf lokalen Maschinen. Aber mittels Output und Input Flüssen man kann diese auch im Netzwerk versuchen. besteht aus zwei Klassen: JSDataBase und JSDataTable. Beide Klassen können von allein benutzt werden. Das heißt JSDataTable kann als selbstständige Klasse dienen. JSDatаBase und JSDataTable sind auf Hashtable und Vector aufgebaut. Wegen der Benutzung von Generics in JSDataBase ist diese Datenbank ab JAVA-Version 5 funktionsfähig. JSDataBase Hilfsklassen: import import import import import import import import import import import import import import java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.InputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.io.OutputStream; java.io.Serializable; java.util.Date; java.util.Enumeration; java.util.Hashtable; java.util.Vector; Inhalt des Klasses JSDataBase 1. Vector<String> getTableNames(); 2. boolean createTable(String tab_name, String kopf); 3. boolean createTable(String tab_name, String kopf, String autoWert); 4. SJDatenTabelle getTable(String tab_name); 5. boolean renameTable(String alteName, String neueName); 6. boolean removeTable(String tab_name); 7. String[] getHeadOf(String tab_name); 8. boolean addColumnsInTo(String tab_name, String col); 9. boolean removeColumnsFrom(String tab_name, String col); 10. boolean renameColumnsFrom(String tab_name, String col); 11. boolean insertInTo(String tab_name, String ds); 12. Vector<String[]> selectFrom(String tab_name, String beschrenkung, String bedingung); 13. Vector<String[]> updateOf(String tab_name, String set, String bedingung); 14. Vector<String[]> deleteFrom(String tab_name, String bedingung); 15. boolean saveTable(String tab_name, OutputStream os); 16. boolean saveTable(String tab_name, File file); 17. boolean loadTable(InputStream is, boolean replace); 18. boolean loadTable(File file, boolean replace); 19. boolean save(OutputStream os) ; 20. boolean save(File file); 21. boolean load(InputStream is); 22. boolean load(File file); 23. String sqlDump(); 1) getTableNames(); Diese Funktion gibt ein Vector<String> mit allen Tabellennamen, die bereits in der Datenbank vorhanden sind, zurück. Wenn getTableNames().size() == 0 ist, dann ist die Datenbank leer, keine Tabellen sind angelegt. 2) createTable(String tab_name, String kopf); Diese Funktion legt eine Tabelle mit Namen aus Parameter tab_name und Tabellenkopf aus Parameter kopf an. Wenn die Funktion true zurückgibt, dann wurde die Tabelle erfolgreich angelegt. Wenn false erscheint, dann heißt es, dass die Tabelle nicht angelegt wurde. Mögliche Ursachen: Syntaktische Fehler oder es existieren bereits Tabellen mit gewünschtem Namen in der Datenbank. Beispiel: JSDataBase db = new JSDataBase(); db.createTable("Test", "ID, Name"); In diesem Fahl wird folgende Tabellenstruktur angelegt. Test ID Name 3) createTable(String tab_name, String kopf, String autoWert); Diese Funktion funktioniert nach gleichem Prinzip wie createTable(String tab_name, String kopf); aber mit einem Unterschied: es wird sofort ein autoWert vorbestimmt. Diese Zahl kann zum Beispiel als Primary Key benutzt werden, die Spalte, die als AutoWer bezeichnet wird, speichert den Index von jedem Datensatz. Dieser Index ist eineindeutig. Parameter autoWert zeigt, welche Spalte als Zähler funktionieren muss. Beispiel: JSDataBase db = new JSDataBase(); db.createTable("User", "ID, Name, Adresse", "ID"); In diesem Fahl wird folgende Tabellenstruktur angelegt, wo ID als Zähler vordefiniert wird. Inhalt von dieser Spalte ist unveränderbar. ID User Name Adresse 4) getTable(String tab_name); Diese Funktion gibt eine Tabelle JSDataTable mit dem Namen, welcher im Parameter tab_name übergegeben wird, zurück oder null im Fall, wenn die Tabelle mit diesem Name nicht existiert. 5) renameTable(String alteName, String neueName); Diese Funktion benennt die Tabelle mit dem Namen alteName in einen neuen Namen neueName um. Im Fall, wenn die Methode true zurückliefert, wurde die Tabelle erfolgreich umbenannt. Wenn false zurückgegeben wird, wurde die Tabelle nicht umbenannt. Mögliche Ursachen: Die Tabelle mit dem Namen alteName existiert in der Datenbank nicht oder der neue Name neueName ist bereits vorgeben. 6) removeTable(String tab_name); Diese Methode entfernt die Tabelle mit dem Name tab_name aus der Datenbank. Die Funktion liefert ein true zurück, wenn die Tabelle erfolgreich gelöscht wurde; falls false zurückgegeben wird, wurde die Tabelle nicht gelöscht. Das heißt die Tabelle mit dem Namen tab_name existiert in der Datenbank nicht. 7) getHeadOf(String tab_name); Diese Methode liefert ein Feld String[] mit Tabellenkopf von Tabelle mit Name tab_name. Oder null , wenn die Tabelle mit diesem Name in der Datenbank nicht existiert. 8) addColumnsInTo(String tab_name, String col); Die Funktion fügt neue Spalten mit Defaultinhalt, welche im Parameter col übergeben werden, in die Tabelle mit dem Namen tab_name ein. Solch eine Methode liefert true zurück, wenn alle Spalten erfolgreich eingefügt worden sind oder false, wenn die Spalten nicht zugefügt wurden. Mögliche Ursachen: Die Tabelle mit dem Name tab_name existiert in der Datenbank nicht oder es stimmt die Syntax von col nicht. Es könnte auch sein, dass eine von den gewünschten Spalten bereits in der Tabelle existiert. Beispiel: JSDataBase db = new JSDataBase(); db.createTable("User", "ID, Name, Adresse", "ID"); // Fügen Sie eine neue Spalte Sex mit Default Inhalt Mann // und Spalte Age mit leerem Inhalt ein db.addColumnsInTo("User", "Sex='Mann', Age=''"); Am Anfang wird folgende Tabellenstruktur angelegt: User Name ID Adresse Dann wird die Tabelle um zwei Spalten vergrößert. ID Name User Adresse Sex Age Im Fall, wenn die Tabelle vor der Erweiterung schon mit Inhalt gefüllt wurde, werden dann die Spalten Sex mit dem Inhalt Mann und Age mit leerem Inhalt in der Tabelle gespeichert. Wie im folgenden Beispiel: Tabellenansicht vor der Erweiterung: User Name Müller Mayer ID 1 2 Adresse Musterstadt Berlin Tabellenansicht nach der Erweiterung: ID 1 2 Name Müller Mayer User Adresse Musterstadt Berlin Sex Mann Mann Age ACHTUNG Das folgende Beispiel enthält syntaktische Fehler! db.addColumnsInTo("User", "Sex, Age"); Neue Spalten müssen immer mit Default Inhalt vorgesehen werden. Um das obere Beispiel richtig zu schreiben, muss es folgendermaßen aussehen: db.addColumnsInTo("User", "Sex='', Age=''" ); 9) removeColumnsFrom(String tab_name, String col); Die Methode löscht Spalten mit den Namen; die werden im Parameter col aus Tabelle mit Name tab_name übergeben. Es wird true zurückgeliefert, wenn alles erfolgreich abgearbeitet wurde oder false, wenn Fehler aufgetreten sind. Mögliche Ursachen: Tabelle mit dem Name tab_name existiert in der Datenbank nicht. Entweder enthält col syntaktischer Fehler, oder eine von den gewünschten Spalten existiert nicht, oder Sie versuchen alle Spalten aus der Tabelle zu löschen (eine Tabelle ohne Spalten ist keine Tabelle). Beispiel: JSDataBase db = new JSDataBase(); db.createTable("User", "ID, Name, Adresse", "ID"); db.addColumnsInTo("User", "Sex='Mann', Age=''"); // Löschen von Spalten ID und Sex db.removeColumnsFrom("User", "ID, Sex"); Tabelle vor der Entfernung ID 1 2 Name Müller Mayer User Adresse Musterstadt Berlin Tabelle nach der Entfernung Name Müller Mayer User Adresse Musterstadt Berlin Age Sex Mann Mann Age 10) renameColumnsFrom(String tab_name, String col); Die Methode benennt Spalten, die in Parameter col eingegeben werden, um. Parameter tab_name zeigt, in welche Tabelle die Spalten umbenannt worden. True wird zurückgegeben, wenn die gewünschten Spalten erfolgreich umbenannt worden sind, ansonsten erscheint false. Mögliche Ursachen: Tabelle mit Name tab_name existiert in der Datenbank nicht oder col enthält syntaktischer Fehler. Es kann sein, dass eine von den gewünschten Spalten nicht existiert oder einer von den neuen Namen bereits vorgegeben ist. Beispiel: JSDataBase db = new JSDataBase(); db.createTable("User", "ID, Name, Adresse", "ID"); db.addColumnsInTo("User", "Sex='Man', Age=''"); db.removeColumnsFrom("User", "ID, Sex"); // Umbenennen von Spalten Adresse und Age in Home und Born db.renameColumnsFrom("User", "Adresse='Home', Age='Born'"); Tabelle vor dem Umbenennen: Name User Adresse Age Tabelle nach dem Umbenennen: User Name Home Born 11) insertInTo(String tab_name, String ds); Diese Funktion fügt eine neue Zeile ds in die Tabelle mit dem Namen tab_name ein. True erscheint, wenn die Zeile erfolgreich hinzugefügt wurde. False wird zurückgegeben, wenn diese nicht hinzugefügt worden ist. Regeln zum Hinzufügen von einer Zeile Man nehme an, dass eine Tabelle mit folgender Struktur vorhanden ist: User Name Home Born Damit man eine neue Zeile einfügen kann, ist es erforderlich, in den Parameter ds folgendes hinzuschreiben: (Spaltenname = 'Inhalt') Wenn Sie Inhalte in mehrere Zeilen einfügen wollen, dann müssen Sie auch diese durch ein Komma abtrennen, wie bei diesem Beispiel: (Spaltenname1 = 'Inhalt1', Spaltenname2 = 'Inhalt2', usw. ) Dabei ist es unwichtig, die Reihenfolge der Zeilen einzuhalten, denn die Inhalte werden nach dem Namen der Spalte geordnet. Der Inhalt muss immer vom Symbol ' eingerahmt werden. Ein Gleichheitszeichen vor dem Spaltnamen sagt aus, dass die folgenden Inhalte in diese Spalte reingeschrieben werden sollen. Beispiel: Wir fügen Inhalte in die oben vorgegebene Tabelle ein. JSDataBase db = new JSDataBase(); db.createTable("User", "ID, Name, Adresse", "ID"); db.addColumnsInTo("User", "Sex='Man', Age=''"); db.removeColumnsFrom("User", "ID, Sex"); db.renameColumnsFrom("User", "Adresse='Home', Age='Born'"); // Inhalte einfügen db.insertInTo("User", "Name='Smith', Born='12.09.1981', Home='USA'"); Nach dem Einfügen sieht die Tabelle folgendermaßen aus: Name Smith User Home USA Born 12.09.1981 Jetzt fügen wir Inhalte mit leeren Spalten ein. // Einfügen von Inhalten mit leeren Spalten db.insertInTo("User", " Home='Berlin', Name='Mayer'"); Ergebnis: Name Smith Berlin User Home USA Mayer Born 12.09.1981 ACHTUNG Zur Benutzung des vorreservierten Symbols ' in Inhalten bitte \\ eingeben. Ein Beispiel ist der folgende Text: I’m Smith Bei Eingeben in die Datenbank soll dieser Satz so aussehen: I\\’m Smith 12) selectFrom(String tab_name, String beschrenkung, String bedingung); Die Funktion zieht Inhalte aus Tabellen mit den Namen tab_name bei bestimmten Bedingungen im Parameter bedingung heraus. Es wird Vector<String[]> mit dem Inhalt, der mit dem Parameter beschrenkung eingeschränkt ist, zurückgegeben; diese Beschränkung entspricht den Bedingungen beim Parameter bedingung. Da diese Base SIMLPE heißt, zählt zu ihrer Grenze der logische Operator AND, welcher hier als ein Komma vorgestellt wird. Alle anderen Operatoren fehlen, da in den meisten Fällen nur AND ausreicht. Das Nutzen von Operatoren * ist erlaubt, hier und überall steht der Operator für ALLES, d.h. wenn Sie alles aus der Tabelle rausziehen wollen, schreiben Sie folgendes: Vector<String[]> content = db.selectFrom("User", "*", "*"); Inhalte, die in Variable content gespeichert sind, werden eine andere Struktur der Überschrift besitzen, wie es bei Punkt 7) getHeadOf(String tab_name); beschrieben steht. Zum Beispiel die folgende Tabelle: Name Smith Mayer User Home USA Berlin Born 12.09.1981 Ausruf der Funktion getHeadOf("User") bringt dieses Massiv zurück: String[]{ "Name" , "Home" , "Born" }; Davon ausgehend, werden alle Massive in der Variable content die Inhalte derselben Struktur besitzen. Zum Beispiel: String[]{ "Smith" , "USA" , "12.09.1981" }; String[]{ "Mayer" , "Berlin" , "" }; Wenn nur das Löschen von Namen nötig ist, dann löschen wir einfach die Inhalte aus Massiven mit dem Index, der mit dem Index "Name" im Tabellenkopf übereinstimmt. Damit man das überflüssige Überarbeiten von Informationen vermeidet, kann man beim Erlagen der Inhalte aus der Tabelle, mithilfe der Funktion 12) selectFrom(…)beim Parameter beschrenkung die Beschränkungen eingeben, die die Ordnung der Struktur der Inhalte von Massiven ermöglichen. Genauso kann man eingeben, welche Spalten gefunden werden sollen und welche nicht. Es ist sogar das mehrfache Zurückkehren einer Spalte möglich. Ein Beispiel zur selben Tabelle: Vector<String[]> content = db.selectFrom("User", "Home, Name, Home", "*"); Hier ist es absichtlich, dass bei der Beschränkung die Spalten in einer anderen Reihenfolge wie die Überschrift der Tabelle eingeben sind und die Spalte Home ist zwei Mal angegeben. Nach dem Ausruf dieser Funktion, werden alle Massive in der Variable content über den Inhalt mit dieser Struktur "Home, Name, Home" verfügen. String[]{ "USA" , "Smith" , "USA" }; String[]{ "Berlin" , "Mayer" , "Berlin" }; Jetzt kann man über alle Massive drübergehen und die nötige Information auswählen. Aber auch das kann man sich ersparen, wenn man beim Ausruf der Funktion 12) selectFrom(…) beim Parameter bedingung die Bedingung angibt, die die Suche der Inhalte einschränkt. Ein Beispiel für dieselbe Tabelle: Vector<String[]> content = db.selectFrom("User", "Born, Name, Home", "Born=''"); Nach dem Ausruf dieser Funktion, werden alle Massive in der Variable content die Inhalte mit folgender Struktur ausweisen: String[]{ "" , "Mayer" , "Berlin" }; 13) updateOf(String tab_name, String set, String bedingung); Diese Funktion erneuert die Inhalte in der Tabelle mit dem Namen tab_name bei bestimmten Bedingungen, die im Parameter bedingung festgelegt sind. Der Operator * ist zugelassen. Beispiel: Die Tabelle vor der Erneuerung Name Smith Mayer User Home USA Berlin Born 12.09.1981 db.updateOf("User", "Born='29.02.1978'", "Born=''"); Nach dem Ausruf dieser Funktion erhalten die Schriften, bei denen die Spalte Born leer ist, '29.02.1978'. Die Tabelle nach der Erneuerung Name Smith Mayer User Home USA Belin Born 12.09.1981 29.02.1978 14) deleteFrom(String tab_name, String bedingung); Diese Funktion löscht Inhalte aus der Tabelle mit dem Namen tab_name unter bestimmten Bedingungen, die beim Parameter bedingung festgelegt sind. Der Operator * ist zugelassen. Die Funktion gibt Vector<String[]> mit gelöschten Inhalten zurück. In dem Fall, wenn der Vektor Null beträgt, dann heißt es, dass das Löschen nicht gelungen ist. Der Syntax des Parameters bedingung ist genauso wie bei der Funktion 12) selectFrom(...); . Beispiel: Name Smith Mayer User Home USA Berlin Born 12.09.1981 29.02.1978 db.deleteFrom("User", "Name='Smith'"); Die Tabelle nach dem Löschen Name Mayer User Home Berlin Born 29.02.1978 14)-22) save / load Methoden Mithilfe dieser Funktionen werden das Speichern und das Laden der Datenbank in eine Datei ermöglicht. Die Funktionen, die der Speicherung und dem Laden bestimmter Tabellen dienen, benötigen den Befehl des Namens der Tabelle oder den Befehl, dass man die Tabelle in der Datenbank überschreiben kann, wenn schon eine Tabelle mit gleichem Namen existiert. tab_name = Name der Tabelle, die gespeichert werden soll replace = Flagge, die kennzeichnet, ob die bereits existierende Tabelle überschreiben werden soll 22) sqlDump(); Diese Funktion gibt String , der SQL-Dump enthält, vollkommen der Datenbank zurück. Dieses Ergebnis kann man kopieren und man kann es zum Beispiel in phpmyadmin zur Generation/ zum Kopieren der Datenbank einfügen. Beispiel zur oberen Tabelle ----- JSDataBase SQL Dump Author: Aleksej Tokarev Dump date: Sun Feb 20 09:13:27 CET 2011 JSDataBase vesion 1.0 --- Table struct for `User` -CREATE TABLE IF NOT EXISTS `User` ( `Name` TEXT DEFAULT NULL, `Home` TEXT DEFAULT NULL, `Born` TEXT DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; INSERT INTO `User` (`Name`,`Home`,`Born`) VALUES ('Mayer','Berlin','29.02.1978'); Zusätzlich Damit Sie zusätzliche Informationen von der Tabelle bekommen, nutzen Sie die Funktion 4) getTable(String tab_name); Anzahl der Inhalte in der Tabelle getTable(String tab_name).getRecordsCount(); // Integer Name der Spalte, die wie ein Zähler arbeitet getTable(String tab_name).get_auto_increment(); // String Der aktuelle Zähler getTable(String tab_name).get_increment(); // Integer Nun habe ich alles beschrieben, was ich in meine Dokumentation einbauen wollte. Sie können sie gern nutzen. Falls Fragen auftreten, Sie Kommentare abgeben wollen oder neue Vorschläge auftauchen, wenden Sie sich bitte durch formelles Kontaktieren auf meiner Seite an mich. http://atoks.bplaced.net/index.php?action=contact