package org.jeecg.config.mybatis.update;

import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.google.common.collect.Maps;
import org.apache.ibatis.mapping.MappedStatement;

import java.util.Map;

/**
 * @description: 利用MyBatisPlus的特性缓存所有实体类的表信息，包括 * 表名，表列名信息
 * @author: niugeng
 * @create: 2023-01-07 15:59
 **/
public class CacheTableInfo extends AbstractMethod {

    private static final long serialVersionUID = -8415259305106624978L;

    public CacheTableInfo() {
        this(SqlMethod.UPDATE.getMethod());
    }

    public CacheTableInfo(String methodName) {
        super(methodName);
    }

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        // 在应用启动时会被循环加载，其中TableInfo实体类存储着我们想要的数据库表信息，这些内容MyBatis-Plus框架已经为我们写好，我们只拿来用即可
        TableCacheDTO tableCacheDTO = new TableCacheDTO();
        tableCacheDTO.setTableName(tableInfo.getTableName()).setKeyColumn(tableInfo.getKeyColumn());
        // 将表的列字段名称保存到Map中。
        Map<String, String> fieldColumn = Maps.newHashMapWithExpectedSize(tableInfo.getFieldList().size());
        for (TableFieldInfo fieldInfo : tableInfo.getFieldList()) {
            /* 例: create_time字段。 fieldInfo.getProperty() == createTime fieldInfo.getColumn() == create_time */
            fieldColumn.put(fieldInfo.getProperty(), fieldInfo.getColumn());
        }
        tableCacheDTO.setFieldColumn(fieldColumn);
        Map<String, TableCacheDTO> tableMaps = TableCache.getTABLE_MAPS();
        // 放入缓存
        tableMaps.put(modelClass.getName(), tableCacheDTO);
        return null;
    }
}
