===== Der objektrelationale Mapper von Jameica =====
==== Einleitung ====
Jameica enthält einen objektrelationalen Mapper, mit dem Java-Objekte in Datenbanken gespeichert und gelesen werden können. Der Mapper kann auch einzeln (ohne Jameica) verwendet werden. Hier müssen sich lediglich folgende Dateien im Classpath befinden:
* de_willuhn_util.jar
* de_willuhn_ds.jar
* der JDBC-Treiber für die Datenbank (z.Bsp.: mysql-connector-java-5.0.7-bin.jar)
Folgendes Beispiel erläutert die Verwendungsweise.
==== Aufbau der SQL-Tabelle ====
Die Tabelle muss manuell erstellt werden. Der Mapper übernimmt dies nicht automatisch.
create table files (
id int(10) auto_increment not null,
name varchar(255) not null,
data longblob not null,
primary key (ID)
);
==== Fachobjekt, welches die Tabelle auf ein Objekt mappt ====
import java.rmi.RemoteException;
import de.willuhn.datasource.db.AbstractDBObject;
import de.willuhn.datasource.rmi.DBObject;
public class TestObject extends AbstractDBObject
{
/**
* ct
* @throws RemoteException
*/
public TestObject() throws RemoteException
{
super();
}
/**
* @see de.willuhn.datasource.db.AbstractDBObject#getPrimaryAttribute()
*/
public String getPrimaryAttribute() throws RemoteException
{
return "name";
}
/**
* @see de.willuhn.datasource.db.AbstractDBObject#getTableName()
*/
protected String getTableName()
{
return "files";
}
/**
* Liefert den Namen der Datei.
* @return Name der Datei.
* @throws RemoteException
*/
public String getName() throws RemoteException
{
return (String) this.getAttribute("name");
}
/**
* Speichert den Namen der Datei.
* @param name Name der Datei.
* @throws RemoteException
*/
public void setName(String name) throws RemoteException
{
setAttribute("name",name);
}
/**
* Liefert den Inhalt der Datei.
* @return Inhalt der Datei.
* @throws RemoteException
*/
public byte[] getData() throws RemoteException
{
return (byte[]) this.getAttribute("data");
}
/**
* Speichert den Inhalt der Datei.
* @param data Inhalt der Datei.
* @throws RemoteException
*/
public void setData(byte[] data) throws RemoteException
{
setAttribute("data",data);
}
}
==== Test-Klasse zum Lesen und Schreiben des Objektes ====
import java.io.*;
import de.willuhn.datasource.db.DBServiceImpl;
import de.willuhn.datasource.rmi.DBService;
import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.logging.Logger;
public class Test
{
public static void main(String[] args) throws Exception
{
// Datenbank-Service erstellen.
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test?useUnicode=Yes&characterEncoding=ISO8859_1&serverTimezone=Europe/Paris";
DBService service = new DBServiceImpl(driver,url,"test","test");
service.start();
// Binaer-Daten einlesen
ByteArrayOutputStream bos = new ByteArrayOutputStream();
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream("/tmp/test.doc"));
copy(is,bos);
}
finally {
if (is != null)
is.close();
}
// neues Objekt erzeugen
TestObject object = (TestObject) service.createObject(TestObject.class,null);
object.setName("Test1");
object.setData(bos.toByteArray());
object.store();
// Die vergebene ID
String id = object.getID();
// Liste der Objekte aus der Datenbank laden
DBIterator list = service.createList(TestObject.class);
// list.addFilter("name = ?", new Object{"test"}); // optionale WHERE-Bedingung
while (list.hasNext())
{
TestObject o = (TestObject) list.next();
System.out.println(o.getName());
}
// einzelnes Objekt laden
TestObject load = (TestObject) service.createObject(TestObject.class,id);
byte[] data = load.getData();
// Binaer-Daten auslesen
ByteArrayInputStream bis = new ByteArrayInputStream(data);
OutputStream os = null;
try {
new BufferedOutputStream(new FileOutputStream("/tmp/test-copy.doc"));
copy(bis,os);
}
finally {
if (os != null)
os.close();
}
// Service stoppen
service.stop(false);
Logger.close();
System.exit(0);
}
private static void copy(InputStream is, OutputStream os) throws Exception
{
byte[] buf = new byte[4096];
int len = 0;
while ((len = is.read(buf)) != -1)
{
os.write(buf,0,len);
}
}
}