Oracle, PHP und XAMPP
Derzeit muss ich für die Uni eine Aufgabe bearbeiten, bei welcher ich mittels PHP auf eine Oracle Datenbank zugreifen muss.
Leider klappt der Zugriff auf Oracle mittels PHP nicht von Haus aus, da die benötigte PHP Extension in der default-php.ini von XAMPP leider nicht aktiviert ist. Aber das aktivieren ist nur minimalster Aufwand.
Hierzu begeben wir uns in den Pfad der XAMPP Installation (hier einfach als $xampp bezeichnet) und suchen darin die php.ini ($xampp/php/php.ini). In dieser suchen wir nun nach der Zeile
;extension=php_oci8.dll
und entfernen das ; am Anfang der Zeile. Dann sieht die Zeile so aus:
extension=php_oci8.dll
Dann noch kurz den Apache neu starten, und siehe da, die Verbindung zu Oracle ist problemlos möglich.
Serialisierung von Java Objekten mit Hibernate
Seit einigen Tagen plagte mich bei einem, von mir Privat getriebenen, Projekt das Problem, erzeugte Objekte in eine Datenbank zu schreiben. Zwar gibt es die Möglichkeit, hier einfach von Hand die entsprechende Engine zu schreiben, um die Attribute in die Datenbank zu schreiben, dies ist aber wie ich finde sehr aufwändig und fehleranfällig. Hibernate war mir aus diesem Kontext schon aus Java EE bekannt, womit sich dieses Framework förmlich aufgedrängt hat.
Hier will ich anhand eines kurzen Beispiel kurz demonstrieren, wie leicht eine Persistierung von Java Objekten in eine Datenbank ist, im Beispiel verwende ich MySql, eine Portierung ist aber nahezu problemlos auf andere Datenbanken wie Oracle, HSQLDB etc. möglich, hierzu müssen nur die entsprechenden Parameter in der Config Datei gesetzt werden und die entsprechenden Treiber in den Buildpath des Projekts eingebunden werden.
Die Konfiguration des MySQL Servers setze ich in dieser Einführung einfach mal vorraus, falls dies noch nicht geschehen ist, bietet sich die Installation von XAMPP an.
Der hier gezeigte Lösungsweg ist nur ein möglicher Weg, es gibt noch viele andere Varianten. Ich habe mich aber aufgrund der leichtesten Implementierung und Verständlichkeit zum
Demonstrieren dieses Weges entschlossen.
Am Anfang sollte man sich als erstes die benötigten Libaries etc. besorgen und in den Buildpath des Java Projekts einzubinden:
- Hibernate (http://www.hibernate.org/)
- dom4j (http://dom4j.sourceforge.net/)
- SLF4J (http://www.slf4j.org/)
- MySQL Connector (http://www.mysql.com/downloads/connector/j/)
Was die einzelnen Pakete nun machen, will ich an dieser Stelle nicht erklären, dass würde eindeutig zu weit führen. Falls alles richtig eingebunden ist, sollten ungefähr die folgenden
Libaries einebunden sein:
Als erstes Implementieren wir eine kurze Demoklasse, welche wir anschließend in die MySQL Datenbank serialisieren wollen.
Meine verwendete Klasse sieht in etwa so aus:
package de.blogd.tutorials.hibernate; /** * Beispiel Klasse an welcher die Serialisierung von * Objekten mittels Hibernate demonstriert wird. * @author Stefan König */ public class MyObject { /** * Zu serialisierender String */ private String aString; /** * Zu serialisierender Integer */ private int aNumber; /** * Zu serialisierendes String Array */ private String[] aStringArray; /** * Getter für aNumber * @return aNumber */ public int getaNumber() { return aNumber; } /** * Setter für aNumber * @param aNumber: Neu zu setzende aNumber */ public void setaNumber(int aNumber) { this.aNumber = aNumber; } /** * Getter für aString * @return aString */ public String getaString() { return aString; } /** * Setter für aString * @param aString */ public void setaString(String aString) { this.aString = aString; } /** * Getter für aStringArray * @return aStringArray */ public String[] getaStringArray() { return aStringArray; } /** * Setter für aStringArray * @param aStringArray */ public void setaStringArray(String[] aStringArray) { this.aStringArray = aStringArray; } }
Damit wäre der erste Schritt erledigt, und wir können uns um die Herstellung der Verbindung zur Datenbank kümmern. Hierzu legen wir im "root" Verzeichnis (also unter "./src/") eine xml
Datei mit dem Namen "hibernate.cfg.xml" an, in dieser wird Hibernate konfiguriert. Einzelne Erklärungen zu den verschiedenen Files befinden sich im Inhalt des xml Files.
< ?xml version='1.0' encoding='utf-8'?> < !DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate -configuration> <session -factory> <!-- Hier werden die Zugangsdaten zur Datenbank angegeben Die Bezeichnungen sind weitestgehenden selbsterklärend --> <property name="connection.url">jdbc:mysql://localhost/HibernateSample</property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.pool_size">1</property> <property name="current_session_context_class">thread</property> <!-- Gibt die SQL Querries auf der Konsole aus --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- Mit dieser Option werden die Tabellen bei jeder Serialisierung neu angelegt, für das Tutorial bietet sich diese Lösung an, sollte aber beim produktiven Einsatz dann entfernt werden. --> <property name="hbm2ddl.auto">create</property> <!-- Es gibt mehrere Methoden zur Definition der zu serialisierenden Klassen, entweder direkt im hibernate.cfg.xml File, oder pro serialisierende Klasse ein eigenes File. Ich habe, zwecks der Übersicht zur Methode mit den einzelnen Files entschieden, diese werden mit den folgenden Befehl eingebunden. Die Namensgebung nach "Klassenname.hbm.xml" ist Konvention und sollte daher nicht verändert werden.--> <mapping resource="de/blogd/tutorials/hibernate/MyObject.hbm.xml" /> </session> </hibernate>
Da nun die Konfiguration für Hibernate, soweit fertig ist, können wir uns daran machen, dass Konfigurationsfile zur Serialisierung der Klasse zu erstellen. Dieses haben wir nach den
Konvention "MyObject.hbm.xml" genannt und befindet sich im selben Package bzw. Ordner wie die vorher erstellte Klasse MyObject.
< ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate -mapping> <!-- Hier geben wir an, welche Klasse wir in die Datenbank speichern möchten ("name") und wie die Tabelle mit den Objekten ("table") genannt werden soll. --> <class name="de.blogd.tutorials.hibernate.MyObject" table="MyObjects"> <!-- Hier legen wir den Primary Key fest --> <id column="id" type="java.lang.Integer"> <generator class="increment"/> </id> <!-- Hier werden die zu speichernden Attribute der Klasse bestimmt, Bei verschiedenen Attributen gibt es noch zusätzliche zur Verfügung stehende Attribute, auf diese möchte ich hier aber nicht weiter eingehen. name="": Name des Attributs (Groß/Kleinschreibung beachten!) type="": Hier wird die Klasse des Attributs angegeben. --> <property name="aString" type="java.lang.String"/> <property name="aNumber" type="java.lang.Integer"/> <!-- Es gibt auch die Möglichkeit Arrays in die Datenbank zu serialisieren, hierfür kann man sich an den folgenden Zeilen orientieren. --> <array name="aStringArray"> <key column="id" /> <list -index base="0" /> <element column="role" type="java.lang.String" /> </array> </class> </hibernate>
Nun haben wir an Konfigurationsdateien alles notwendige erstellt und können uns dem Speichervorgang in die Datenbank selbst widmen.
package hibernatetutorial; import de.blogd.tutorials.hibernate.MyObject; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; /** * In dieser Klasse wird die Serialisierung * mittels entsprechender Methoden erledigt. * @author Stefan */ public class Main { private static SessionFactory mySessionFactory; /** * Singleton zur Rückgabe einer aktuellen Session. * @return SessionFactgory */ public static SessionFactory getSessionFactory(){ if(mySessionFactory == null) mySessionFactory = new Configuration().configure().buildSessionFactory(); return mySessionFactory; } /** * Erzeugt neue Session mit Hilfe der Session Factory * @return Session */ public static Session getSession(){ return getSessionFactory().openSession(); } public static void main(String[] args){ /** * Das zu serialisierende Objekt anlegen. */ MyObject sampleObject = new MyObject(); sampleObject.setaNumber(43); sampleObject.setaString("Ich bin ein String"); String[] sampleStringArray = {"Hallo","ich","bin","ein","String","Array"}; sampleObject.setaStringArray(sampleStringArray); /** * Session zur Serialisierung anlegen. */ Session mySession = getSession(); /** * Transaktion beginnen */ Transaction myTransaction = mySession.beginTransaction(); /** * Objekte in Datenbank schreiben. */ mySession.save(sampleObject); /** * Transaktion abschließen */ myTransaction.commit(); } }
Falls dies nun fehlerfrei durchgelaufen ist, sollte der Eintrag in die Datenbank erfolgreich vorgenommen worden sein. Für das Deserialisieren der Files, werde in in den nächsten Tagen einen extra Artikel zur Verfügung stellen.
Download der Source Files (inkl. xml Files): Hibernate Tutorial Files
