All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sf.database.util.OrmValueUtils Maven / Gradle / Ivy

The newest version!
package sf.database.util;

import sf.core.DBObject;
import sf.database.OrmConfig;
import sf.database.meta.ColumnMapping;
import sf.database.meta.MetaHolder;
import sf.database.meta.TableMapping;
import sf.spring.util.ReflectionUtils;

import java.lang.reflect.Field;

/**
 * orm的设置值的方法
 */
public class OrmValueUtils {

    /**
     * 设置值的方法.
     */
    public enum BeanValueType {
        /**
         * 按字段
         */
        field,
        /**
         * 按方法(默认)
         */
        method,
        /**
         * 按reflectasm方法
         */
        reflectasm,
        /**
         * 快速,使用pull和push(暂时未实现)
         */
        fast,
        /**
         * 其他方法(备用,未实现)
         */
        other
    }

    /**
     * 实例化,提供快速实例化,或标准实例化
     * @param clz
     * @param 
     * @return
     */
    public static  T instance(Class clz) {
        try {
            return clz.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 实例化,提供快速实例化,或标准实例化
     * @param tm
     * @param 
     * @return
     */
    public static  T instance(TableMapping tm) {
        if (OrmConfig.getInstance().getBeanValueType() == BeanValueType.reflectasm) {
            return (T) tm.getConstructorAccess().newInstance();
        }
        try {
            return (T) tm.getThisType().getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 设置值
     * @param obj
     * @param cm
     * @param value
     * @param 
     */
    public static  void setValue(T obj, ColumnMapping cm, Object value) {
        setValue(obj, cm, value, OrmConfig.getInstance().getBeanValueType());
    }

    /**
     * @param obj
     * @param cm
     * @param value
     * @param beanValueType
     * @param 
     */
    public static  void setValue(T obj, ColumnMapping cm, Object value, BeanValueType beanValueType) {
        switch (beanValueType) {
            case reflectasm:
                setValueMethodReflectasm(obj, cm, value);
                break;
            case field:
                setValueFieldReflect(obj, cm, value);
                break;
            case fast:
                if (DBObject.class.isAssignableFrom(cm.getMeta().getThisType()) && cm.getMeta().isExistPushMethod()) {
                    DBObject o = (DBObject) obj;
                    setValueMethodFast(o, cm, value);
                    break;
                }
            case method:
            default:
                setValueMethodReflect(obj, cm, value);
                break;
        }
    }

    /**
     * 使用field 反射设置值
     * @param obj
     * @param cm
     * @param value
     * @param 
     */
    private static  void setValueFieldReflect(T obj, ColumnMapping cm, Object value) {
        Field f = cm.getFieldAccessor().getField();
        if (!f.isAccessible()) {
            f.setAccessible(true);
        }
        ReflectionUtils.setField(cm.getFieldAccessor().getField(), obj, value);
    }

    /**
     * 使用method 反射设置值
     * @param obj
     * @param cm
     * @param value
     * @param 
     */
    private static  void setValueMethodReflect(T obj, ColumnMapping cm, Object value) {
        cm.getFieldAccessor().set(obj, value);
    }

    /**
     * @param obj
     * @param cm
     * @param value
     * @param 
     */
    private static  void setValueMethodReflectasm(T obj, ColumnMapping cm, Object value) {
        cm.getMeta().getMethodAccess().invoke(obj, cm.getFieldAccessor().getReflectasmSetterIndex(), value);
    }

    /**
     * @param obj
     * @param cm
     * @param value
     * @param 
     */
    private static  void setValueMethodFast(T obj, ColumnMapping cm, Object value) {
        obj.push(cm.getFieldName(), value);
    }

    /**
     * @param obj
     * @param cm
     * @param 
     * @param 
     * @return
     */
    public static  U getValue(T obj, ColumnMapping cm) {
        return getValue(obj, cm, OrmConfig.getInstance().getBeanValueType());
    }

    /**
     * @param obj
     * @param cm
     * @param beanValueType
     * @param 
     * @param 
     * @return
     */
    public static  U getValue(T obj, ColumnMapping cm, BeanValueType beanValueType) {
        if (MetaHolder.getMeta(obj.getClass()) != cm.getMeta()) {
            throw new RuntimeException("类型不一致");
        }

        switch (beanValueType) {
            case reflectasm:
                return getValueMethodReflectasm(obj, cm);
            case field:
                return getValueFieldReflect(obj, cm);
            case fast:
                if (DBObject.class.isAssignableFrom(cm.getMeta().getThisType()) && cm.getMeta().isExistPullMethod()) {
                    DBObject o = (DBObject) obj;
                    return getValueMethodFast(o, cm);
                }
            case method:
            default:
                return getValueMethodReflect(obj, cm);
        }
    }

    /**
     * @param obj
     * @param cm
     * @param 
     * @param 
     * @return
     */
    private static  U getValueFieldReflect(T obj, ColumnMapping cm) {
        Field f = cm.getFieldAccessor().getField();
        if (!f.isAccessible()) {
            f.setAccessible(true);
        }
        Object value = ReflectionUtils.getField(f, obj);
        return (U) value;
    }

    /**
     * @param obj
     * @param cm
     * @param 
     * @param 
     * @return
     */
    private static  U getValueMethodReflect(T obj, ColumnMapping cm) {
        Object value = cm.getFieldAccessor().get(obj);
        return (U) value;
    }

    /**
     * @param obj
     * @param cm
     * @param 
     * @param 
     * @return
     */
    private static  U getValueMethodReflectasm(T obj, ColumnMapping cm) {
        Object value = cm.getMeta().getMethodAccess().invoke(obj, cm.getFieldAccessor().getReflectasmGetterIndex());
        return (U) value;
    }

    /**
     * @param obj
     * @param cm
     * @param 
     * @param 
     * @return
     */
    private static  U getValueMethodFast(T obj, ColumnMapping cm) {
        Object value = obj.pull(cm.getFieldName());
        return (U) value;
    }
}