我想创建一个基于枚举的通用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未定义value()方法
- 类型T未定义values()方法
- 类型T未定义values()方法
我用以下代码解决了这个问题:
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);
}
}