Я хотел бы создать общий картограф на основе перечисления для IBatis.Я делаю это с помощью приведенного ниже кода.Это имеет ошибки времени компиляции, которые я не знаю, как исправить.Возможно, мое решение просто неверно (имейте в виду использование IBatis), в таком случае, пожалуйста, предложите что-нибудь получше.
Любая помощь приветствуется.
Чего я хочу добиться, так это определить последующееотображает как:
public class XEnumTypeHandler extends CommonEnumTypeHandler<X> {
}
Текущий код:
public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {
public void setParameter(ParameterSetter ps, Object o) throws SQLException {
if (o.getClass().isAssignableFrom(**T**)) {
ps.setString(((**T**) o).value().toUpperCase());
} else
throw new SQLException("Excpected ParameterType object than: " + o);
}
public Object getResult(ResultGetter rs) throws SQLException {
Object o = valueOf(rs.getString());
if (o == null)
throw new SQLException("Unknown parameter type: " + rs.getString());
return o;
}
public Object valueOf(String s) {
for (T pt : T.**values()**) {
if (pt.**value()**.equalsIgnoreCase(s))
return pt;
}
return null;
}
}
Я добавил метки ошибок в приведенный выше код, сообщения об ошибках в следующем порядке:
- T не может быть разрешено
- Значение метода () не определено для типа T
- Значения метода () не определены для типа T
- Значения метода () не определен для типа T
Я решил эту проблему с помощью следующего кода:
public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {
Class<T> clazz;
public CommonEnumTypeHandler(Class<T> clazz) {
this.clazz = clazz;
}
public void setParameter(ParameterSetter ps, Object o) throws SQLException {
if (o.getClass().isAssignableFrom(clazz)) {
ps.setString(((T) o).name().toUpperCase());
} else
throw new SQLException("Excpected " + clazz + " object than: " + o);
}
public Object getResult(ResultGetter rs) throws SQLException {
Object o = valueOf(rs.getString());
if (o == null)
throw new SQLException("Unknown parameter type: " + rs.getString());
return o;
}
public Object valueOf(String s) {
return Enum.valueOf(clazz, s);
}
}
Наследование от этого класса я делаю:
public class SalesChannelTypeHandler extends CommonEnumTypeHandler<SalesChannel> {
public SalesChannelTypeHandler() {
super(SalesChannel.class);
}
public SalesChannelTypeHandler(Class<SalesChannel> clazz) {
super(clazz);
}
}