org.beetl.sql.clazz.EnumKit Maven / Gradle / Ivy
package org.beetl.sql.clazz;
import org.beetl.sql.annotation.entity.EnumMapping;
import org.beetl.sql.annotation.entity.EnumValue;
import org.beetl.sql.clazz.kit.BeanKit;
import org.beetl.sql.clazz.kit.Cache;
import org.beetl.sql.clazz.kit.DefaultCache;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* 记录下实体类中存在的枚举字段与结果集映射的配置信息
* {@link EnumMapping} 和 {@link EnumValue}
* @author xiandafu
*/
public class EnumKit {
/*所有遇到的枚举类的缓存*/
private static final Cache cache = new DefaultCache<>();
/**
* 获得枚举,根据EnumMapping 注解,如果没有,则使用枚举名称
* @param c 枚举类
* @param value 参考值
* @return 枚举
*/
public static Enum getEnumByValue(Class c, Object value) {
if (value == null) {
return null;
}
if (!c.isEnum()) {
throw new IllegalArgumentException(c.getName());
}
EnumConfig config = cache.get(c);
if (config == null) {
config = init(c);
}
//测试 SQLServer 数据库的 tinyint 类型 会被转为 Short 而如果封装时Key的类型为Integer 则无法取出
if (Short.class == value.getClass()) {
value = ((Short) value).intValue();
}
return config.map.get(value);
}
/**
* 得到枚举类在数据库中表达的值
* @param en
* @return
*/
public static Object getValueByEnum(Object en) {
if (en == null) {
return null;
}
Class c = en.getClass();
EnumConfig config = cache.get(c);
if (config == null) {
config = init(c);
}
return config.dbMap.get(en);
}
/**
* 初始化枚举的映射,如果,则默认按照枚举的名字来,即value是一个字符串
* @param c
* @see ClassAnnotation
*/
public static EnumConfig init(Class c) {
EnumConfig config = cache.get(c);
if (config != null) {
return config;
}
String valueAttrName = lookupEnumValueAttr(c);
if (valueAttrName != null) {
config = init(c, valueAttrName);
} else {
config = initDefaultValue(c);
}
return config;
}
/**
* 自定义枚举类与的数据库数字关系
* @param c
* @param config
*/
public static void init(Class c,EnumConfig config) {
cache.putIfAbsent(c,config);
}
/**
* 使用枚举名称作为值
* @param c
* @return
*/
private static EnumConfig initDefaultValue(Class c) {
Map
© 2015 - 2024 Weber Informatics LLC | Privacy Policy