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

com.github.freegeese.easymybatis.meta.MetaMapperClass Maven / Gradle / Ivy

The newest version!
package com.github.freegeese.easymybatis.meta;

import com.github.freegeese.easymybatis.util.RefUtils;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.mapping.MappedStatement;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Mapper类元数据信息
 *
 * @author zhangguangyong
 * @since 1.0
 */
@Slf4j
@Getter
public class MetaMapperClass {
    /**
     * 获取 {@link MappedStatement#getId()}
     */
    private String id;
    /**
     * 实体类型
     */
    private Class entityClass;
    /**
     * Mapper类型
     */
    private Class mapperClass;
    /**
     * Mapper方法返回值类型
     */
    private Map> methodGenericReturnTypeMap;

    /**
     * 解析Mapper类型元信息
     *
     * @param mappedStatement
     * @return
     */
    public static MetaMapperClass forMappedStatement(MappedStatement mappedStatement) {
        MetaMapperClass meta = new MetaMapperClass();
        String id = mappedStatement.getId();
        meta.id = id;
        try {
            Class mapperClass = Class.forName(id.substring(0, id.lastIndexOf(".")));
            meta.mapperClass = mapperClass;

            // 继承接口
            Type[] genericInterfaces = mapperClass.getGenericInterfaces();
            if (Objects.isNull(genericInterfaces) || genericInterfaces.length == 0) {
                return meta;
            }
            // 泛型参数
            ParameterizedType parameterizedType = (ParameterizedType) genericInterfaces[0];
            Type[] types = parameterizedType.getActualTypeArguments();
            if (Objects.isNull(types) || types.length == 0) {
                return meta;
            }
            meta.entityClass = (Class) types[0];

            // 方法返回泛型类型
            Map> methodGenericReturnTypeMap = new HashMap<>();
            meta.methodGenericReturnTypeMap = methodGenericReturnTypeMap;

            // 泛型类型名称与泛型类型的映射
            Map> genericNameAndTypeMap = RefUtils.getGenericNameAndTypeMap(mapperClass);
            if (Objects.isNull(genericNameAndTypeMap) || genericNameAndTypeMap.isEmpty()) {
                return meta;
            }

            List methods = RefUtils.getAllDeclaredMethods(mapperClass);
            for (Method method : methods) {
                Type type = method.getGenericReturnType();
                if (type instanceof TypeVariable) {
                    String typeName = type.getTypeName();
                    if (genericNameAndTypeMap.containsKey(typeName)) {
                        methodGenericReturnTypeMap.put(method.getName(), genericNameAndTypeMap.get(typeName));
                    }
                }
                if (type instanceof ParameterizedType) {
                    ParameterizedType pt = (ParameterizedType) type;
                    Type[] actualTypeArguments = pt.getActualTypeArguments();
                    for (Type actualTypeArgument : actualTypeArguments) {
                        String typeName = actualTypeArgument.getTypeName();
                        if (genericNameAndTypeMap.containsKey(typeName)) {
                            methodGenericReturnTypeMap.put(method.getName(), genericNameAndTypeMap.get(typeName));
                        }
                    }
                }
            }

            return meta;
        } catch (ClassNotFoundException e) {
            log.error("获取 entityClass 和  mapperClass 发生异常[" + id + "]", e);
            throw new RuntimeException(e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy