枚举类型处理器
dbVisitor 对于枚举类型会自动选择 EnumTypeHandler 进行处理,一般无需干预。
如对象映射中存在枚举字段
public class User {
private UserType userType;
// getters and setters omitted
}
查询和参数传递无需特别处理
// 查询结果中枚举字段会自 动转换
jdbc.queryForList("select * from users", User.class);
// 枚举参数也会自动处理
User userInfo = ...;
jdbc.queryForList("select * from users where user_type = #{userType}", userInfo);
信息
默认情况下,EnumTypeHandler 使用枚举的 name() 值与数据库字段进行映射(字符串方式)。
显式声明
在参数传递中显式指定
jdbc.queryForList(
"select * from users where user_type = #{userType, typeHandler=net.hasor.dbvisitor.types.handler.string.EnumTypeHandler}",
userInfo
);
在对象映射中显式指定
public class User {
@Column(typeHandler = EnumTypeHandler.class)
private UserType userType;
// getters and setters omitted
}
- EnumTypeHandler 完整类名:
net.hasor.dbvisitor.types.handler.string.EnumTypeHandler
将数值映射到枚举
若数据库中存储的是数字,需要枚举实现 EnumOfValue 接口来完成数值与枚举的转换。
public enum LicenseEnum implements EnumOfValue<LicenseEnum> {
Private(0),
AGPLv3(1),
GPLv3(2);
private final int type;
LicenseEnum(int type) {
this.type = type;
}
public int codeValue() {
return this.type;
}
public LicenseEnum valueOfCode(int codeValue) {
for (LicenseEnum item : LicenseEnum.values()) {
if (item.codeValue() == codeValue) {
return item;
}
}
return null;
}
}
EnumOfValue接口位于net.hasor.dbvisitor.types.handler.string包
将 Code 映射到枚举
当枚举的 name() 不能直接作为数据库映射值时,可以让枚举实现 EnumOfCode 接口来自定义字符串映射逻辑。
public enum LicenseEnum implements EnumOfCode<LicenseEnum> {
Private("private_license"),
AGPLv3("agpl_v3"),
GPLv3("gpl_v3");
private final String code;
LicenseEnum(String code) {
this.code = code;
}
public String codeName() {
return this.code;
}
public LicenseEnum valueOfCode(String codeValue) {
for (LicenseEnum item : LicenseEnum.values()) {
if (item.codeName().equalsIgnoreCase(codeValue)) {
return item;
}
}
return null;
}
}
EnumOfCode接口位于net.hasor.dbvisitor.types.handler.string包- 如果枚举已有默认的
codeName()方法(返回name()),可以只重写valueOfCode方法