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

com.jeesuite.mybatis.crud.helper.EntityHelper Maven / Gradle / Ivy

There is a newer version: 1.4.0
Show newest version
package com.jeesuite.mybatis.crud.helper;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.jeesuite.mybatis.core.BaseEntity;

public class EntityHelper {

    /**
     * 缓存TableMapper
     */
    private final static Map, EntityMapper> tableMapperCache = new HashMap, EntityMapper>();
    private final static Map> entityFieldMappings = new HashMap<>();
    private final static Map> tableColumnMappings = new HashMap<>();

    /**
     * 由传入的实体的class构建TableMapper对象,构建好的对象存入缓存中,以后使用时直接从缓存中获取
     * 
     * @param entityClass
     * @return TableMapper
     */
    public static EntityMapper getEntityMapper(Class entityClass) {

        synchronized (entityClass) {
            // 先从map中获取实体映射信息
            EntityMapper entityMapper = tableMapperCache.get(entityClass);

            // 如果存在直接返回
            if (entityMapper != null) {
                return entityMapper;
            }

            TableMapper tableMapper = getTableMapper(entityClass);

            //获取实体ID泛型
            Class idClass = getIdClass(entityClass);

            // 获取实体字段列表
            List fields = getAllField(entityClass);
            // 全部列
            Set columnMapperSet = new HashSet();
            // 主键
            ColumnMapper idColumn = null;
            GenerationType idStrategy = null;

            Map map = new HashMap<>();
            for (Field field : fields) {

                // 排除字段
                if (field.isAnnotationPresent(Transient.class)) {
                    continue;
                }
                ColumnMapper columnMapper = new ColumnMapper();

                // 数据库字段名
                String columnName = null;
                if (field.isAnnotationPresent(Column.class)) {
                    Column column = field.getAnnotation(Column.class);
                    columnName = column.name();
                    columnMapper.setInsertable(column.insertable());
                    columnMapper.setUpdatable(column.updatable());
                }
                // 如果为空,使用属性名并替换为下划线风格
                if (columnName == null || columnName.equals("")) {
                    columnName = camelhumpToUnderline(field.getName());
                }

                columnMapper.setProperty(field.getName());
                columnMapper.setColumn(columnName);
                columnMapper.setJavaType(field.getType());

                // 是否主键
                if(field.isAnnotationPresent(Id.class)){                	
                	columnMapper.setId(true);
                	if(field.isAnnotationPresent(GeneratedValue.class)){ 
                		idStrategy = field.getAnnotation(GeneratedValue.class).strategy();
                	}
                	idColumn = columnMapper;
                }
                // 添加到所有字段映射信息
                columnMapperSet.add(columnMapper);
                //
                field.setAccessible(true);
                map.put(field.getName(), field);
            }
            
            entityFieldMappings.put(tableMapper.getName(), map);
            
            if (columnMapperSet.size() <= 0) {
                throw new RuntimeException("实体" + entityClass.getName() + "不存在映射字段");
            }
            if (idColumn == null) {
                throw new RuntimeException("实体" + entityClass.getName() + "不存在主键");
            }

            // 解析实体映射信息
            entityMapper = new EntityMapper();
            entityMapper.setTableMapper(tableMapper);
            entityMapper.setColumnsMapper(columnMapperSet);
            entityMapper.setIdClass(idClass);
            entityMapper.setIdColumn(idColumn);
            entityMapper.setIdStrategy(idStrategy);

            tableMapperCache.put(entityClass, entityMapper);
            //
            tableColumnMappings.put(tableMapper.getName().toLowerCase(), new ArrayList<>(columnMapperSet));
            return entityMapper;
        }
    }
    
    public static List getTableColumnMappers(String tableName){
    	return tableColumnMappings.get(tableName.toLowerCase());
    }

    /**
     * 获取实体的ID泛型
     * @param entityClass
     * @return
     */
    private static Class getIdClass(Class entityClass) {
        Type[] genTypes = entityClass.getGenericInterfaces();

        for (int i = 0; i < genTypes.length; i++) {
            Type genType = genTypes[i];
            String s1 = genType.getClass().getName();
            String s2 = BaseEntity.class.getName();
            if (s1.startsWith(s2)) {
                Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
                // ID真实的class
                Class mapperClass = (Class) params[0];
                return mapperClass;
            }
        }

        return null;
    }

    // 获取实体Table映射信息
    private static TableMapper getTableMapper(Class entityClass) {
        // 表名
        TableMapper tableMapper = new TableMapper();
        String tableName = null;
        if (entityClass.isAnnotationPresent(Table.class)) {
            Table table = entityClass.getAnnotation(Table.class);
            if (!table.name().equals("")) {
                tableName = table.name();
            } else {
                tableName = camelhumpToUnderline(entityClass.getSimpleName());
            }
        }

        if (tableName == null || tableName.equals("")) {
            throw new RuntimeException("实体" + entityClass.getName() + "不存在'Table'注解");
        }

        tableMapper.setName(tableName);
        return tableMapper;
    }

    /**
     * 将驼峰风格替换为下划线风格
     */
    private static String camelhumpToUnderline(String str) {
        final int size;
        final char[] chars;
        final StringBuilder sb = new StringBuilder((size = (chars = str.toCharArray()).length) * 3 / 2 + 1);
        char c;
        for (int i = 0; i < size; i++) {
            c = chars[i];
            if (isUppercaseAlpha(c)) {
                sb.append('_').append(c);
            } else {
                sb.append(toUpperAscii(c));
            }
        }
        String result = sb.charAt(0) == '_' ? sb.substring(1) : sb.toString();
        return result.toLowerCase();
    }

    private static boolean isUppercaseAlpha(char c) {
        return (c >= 'A') && (c <= 'Z');
    }

    private static char toUpperAscii(char c) {
        if (isUppercaseAlpha(c)) {
            c -= (char) 0x20;
        }
        return c;
    }

    /**
     * 获取全部的Field
     * 
     * @param entityClass
     * @param fieldList
     * @return
     */
    private static List getAllField(Class entityClass) {
        return getAllField(entityClass, null);
    }

    /**
     * 获取全部的Field
     *
     * @param entityClass
     * @param fieldList
     * @return
     */
    private static List getAllField(Class entityClass, List fieldList) {
        if (fieldList == null) {
            fieldList = new ArrayList();
        }
        if (entityClass.equals(Object.class)) {
            return fieldList;
        }
        Field[] fields = entityClass.getDeclaredFields();
        for (Field field : fields) {
            // 排除静态字段
            if (!Modifier.isStatic(field.getModifiers())) {
                fieldList.add(field);
            }
        }
        Class superClass = entityClass.getSuperclass();
        if (superClass != null && !superClass.equals(Object.class)
                && (!Map.class.isAssignableFrom(superClass) && !Collection.class.isAssignableFrom(superClass))) {
            return getAllField(entityClass.getSuperclass(), fieldList);
        }
        return fieldList;
    }
    
    public static Field getEntityField(String tableName,String fieldName){
    	return entityFieldMappings.get(tableName).get(fieldName);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy