Inhaltsverzeichnis

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:

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);
    }
  }
}