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