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

org.zodiac.mybatisplus.binding.parser.PropInfo Maven / Gradle / Ivy

There is a newer version: 1.6.8
Show newest version
package org.zodiac.mybatisplus.binding.parser;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.zodiac.commons.util.BeanUtil;
import org.zodiac.commons.util.Colls;
import org.zodiac.mybatisplus.base.BaseEntity;
import org.zodiac.mybatisplus.util.MyBatisPlusSpringBootUtil;
import org.zodiac.sdk.toolkit.util.lang.StrUtil;

/**
 * Bean相关信息缓存。
 * 
 */
public class PropInfo implements Serializable {

    private static final long serialVersionUID = -9212408337377175128L;

    /**
     * 主键列
     */
    private String idColumn;
    /**
     * 主键字段类型
     */
    private Class idFieldType;
    /**
     * 逻辑删除列
     */
    private String deletedColumn;
    /**
     * 列集合
     */
    private final List columns = new ArrayList<>();
    /**
     * 字段-列的映射
     */
    private final Map fieldToColumnMap = new HashMap<>();
    /**
     * 列-字段的映射
     */
    private final Map columnToFieldMap = new HashMap<>();
    /**
     * 列-字段类型的映射
     */
    private final Map columnToFieldTypeMap = new HashMap<>();
    /**
     * 自动更新字段列表
     */
    private final List fillUpdateFieldList = new ArrayList<>();

    public PropInfo(Class beanClass) {
        this(beanClass, true);
    }

    public PropInfo(Class beanClass, boolean isEntityClass) {
        List fields = BeanUtil.extractAllFields(beanClass);
        if (Colls.notEmptyColl(fields)) {
            for (Field fld : fields) {
                String fldName = fld.getName();
                String columnName = null;
                TableField tableField = fld.getAnnotation(TableField.class);
                if (tableField != null) {
                    if (tableField.exist() == false) {
                        columnName = null;
                    } else {
                        if (StrUtil.isNotBlank(tableField.value())) {
                            columnName = tableField.value();
                        } else {
                            columnName = StrUtil.toSnakeCase(fldName);
                        }
                        FieldFill fill = tableField.fill();
                        if (FieldFill.UPDATE.equals(fill) || FieldFill.INSERT_UPDATE.equals(fill)) {
                            fillUpdateFieldList.add(fldName);
                        }
                    }
                }
                /*主键。*/
                TableId tableId = fld.getAnnotation(TableId.class);
                if (tableId != null && this.idColumn == null) {
                    if (StrUtil.isNotBlank(tableId.value())) {
                        columnName = tableId.value();
                    } else if (columnName == null) {
                        columnName = StrUtil.toSnakeCase(fldName);
                    }
                    this.idColumn = columnName;
                    if (beanClass.isAssignableFrom(BaseEntity.class)) {
                        this.idFieldType = Long.class;
                    } else {
                        this.idFieldType = fld.getType();
                    }
                } else {
                    TableLogic tableLogic = fld.getAnnotation(TableLogic.class);
                    if (tableLogic != null) {
                        if (columnName == null) {
                            columnName = StrUtil.toSnakeCase(fldName);
                        }
                        this.deletedColumn = columnName;
                        if (StrUtil.isNotBlank(tableLogic.value())) {
                            MyBatisPlusSpringBootUtil.setActiveFlagValue(tableLogic.value());
                        }
                    }
                }
                /*实体类基于默认规则提取列名。*/
                if (columnName == null && isEntityClass) {
                    columnName = StrUtil.toSnakeCase(fldName);
                }
                this.fieldToColumnMap.put(fldName, columnName);
                if (StrUtil.isNotBlank(columnName)) {
                    this.columnToFieldMap.put(columnName, fldName);
                    if (this.idColumn != null && columnName.equals(this.idColumn)
                        && beanClass.isAssignableFrom(BaseEntity.class)) {
                        this.columnToFieldTypeMap.put(columnName, Long.class);
                    } else {
                        this.columnToFieldTypeMap.put(columnName, fld.getType());
                    }
                    this.columns.add(columnName);
                }
            }
        }

    }

    public String getIdColumn() {
        return idColumn;
    }

    public Class getIdFieldType() {
        return idFieldType;
    }

    public String getDeletedColumn() {
        return deletedColumn;
    }

    public List getColumns() {
        return columns;
    }

    public Map getFieldToColumnMap() {
        return fieldToColumnMap;
    }

    public Map getColumnToFieldMap() {
        return columnToFieldMap;
    }

    public Map getColumnToFieldTypeMap() {
        return columnToFieldTypeMap;
    }

    public List getFillUpdateFieldList() {
        return fillUpdateFieldList;
    }

    public String getFieldByColumn(String columnName) {
        if (Colls.isEmpty(this.columnToFieldMap)) {
            return null;
        }
        return this.columnToFieldMap.get(columnName);
    }

    public String getColumnByField(String fieldName) {
        if (Colls.isEmpty(this.fieldToColumnMap)) {
            return null;
        }
        return this.fieldToColumnMap.get(fieldName);
    }

    public String getIdFieldName() {
        if (Colls.isEmpty(this.columnToFieldMap)) {
            return null;
        }
        return this.columnToFieldMap.get(idColumn);
    }

    public Class getFieldTypeByColumn(String columnName) {
        if (Colls.isEmpty(this.columnToFieldTypeMap)) {
            return null;
        }
        return this.columnToFieldTypeMap.get(columnName);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy