Ich verwende gerne Java Enumerations, wenn ein Datenbankfeld nur eine bestimmte Anzahl an Typen enthalten kann . Ein Beispiel wäre eine Tabelle CONTACTS (ich gebe mal nicht alle Felder an) mit dem Feld “TYPE”, das PRIVATE,BUSINESS oder OTHER enthalten kann:
CREATE TABLE CONTACTS (
ID INTEGER NOT NULL,
TYPE AS VARCHAR(24),
NAME VARCHAR(50) NOT NULL,
.
.
.
PRIMARY KEY (ID)
);
Für das Datenbankfeld TYPE erstelle ich folgende Enumeration:
Nehmen wir mal an, wir haben folgende Enumeration:
public enum ContactType {
PRIVATE, BUSINESS, OTHER
}
Und dann noch folgendes Modell:
package de.binnichda.comp;
public class Contact {
private Long id;
private ContactType type;
private String name;
/* Und natürlich die zugehörigen Getter/Setter ... */
}
Noch kann man jetzt leider noch nicht viel mit der Enumeration anfangen, denn IBatis muss noch wissen, wie es diesen Typen behandeln soll. Dazu muss man eine Klasse erstellen, die “TypeHandlerCallback” implementiert. Mit Java 5 bietet es sich an, das ganze generisch zu erschlagen:
package de.binnichda.comp;
@SuppressWarnings("unchecked")
public class GenericEnumHandlerCallback <E extends Enum> implements TypeHandlerCallback {
private Class<E> enumClass;
public GenericEnumHandlerCallback(Class<E> enumClass) {
this.enumClass = enumClass;
}
private Class<E> getEnumClass() { return enumClass; }
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
setter.setString(parameter.toString());
}
public Object getResult(ResultGetter getter) throws SQLException {
return valueOf(getter.getString());
}
public Object valueOf(String s) {
if (s == null)
return null;
else
return Enum.valueOf(getEnumClass(), s);
}
}
Mein konkreter ContactTypeHandler muss dann folgendermaßen aussehen:
package de.binnichda.comp;
public class ContactTypeHandlerCallback extends
GenericEnumHandlerCallback<ContactType> {
public ContactTypeHandlerCallback() {
super(ContactType.class);
}
}
Jetzt noch den TypeHandlerCallback IBatis bekannt geben:
<typeHandler javaType="de.binnichda.comp.ContactType" callback="de.binnichda.comp.ContactTypeHandlerCallback"/>
Fertig, die Enumeration kann verwendet werden:
Contact contact = new Contact();
contact.setName("Felix Meinhold");
contact.setType(ContactType.PRIVATE);
contactDao.save(contact);
Oder folgendes IBatis Mapping, um mehrere Contact Typen abzufragen:
<select id = "findByContacts" parameterClass="map" resultMap = "contactMap">
SELECT * FROM CONTACTS
<isNotEmpty property="contactTypes" prepend="WHERE TYPE_ IN ">
<iterate property="contactTypes"
open="(" close=")"
conjunction=",">#contactTypes[]#</iterate>
</isNotEmpty>
</select>