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

cn.org.atool.fluent.mybatis.segment.BaseWrapper Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.segment;

import cn.org.atool.fluent.mybatis.base.IEntity;
import cn.org.atool.fluent.mybatis.base.crud.IBaseQuery;
import cn.org.atool.fluent.mybatis.base.crud.IWrapper;
import cn.org.atool.fluent.mybatis.base.entity.IMapping;
import cn.org.atool.fluent.mybatis.base.model.Column;
import cn.org.atool.fluent.mybatis.base.model.FieldMapping;
import cn.org.atool.fluent.mybatis.base.model.FieldType;
import cn.org.atool.fluent.mybatis.metadata.DbType;
import cn.org.atool.fluent.mybatis.metadata.TableMeta;
import cn.org.atool.fluent.mybatis.metadata.TableMetaHelper;
import cn.org.atool.fluent.mybatis.segment.model.Parameters;
import cn.org.atool.fluent.mybatis.segment.model.WrapperData;
import lombok.Getter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

import static cn.org.atool.fluent.mybatis.If.isBlank;
import static cn.org.atool.fluent.mybatis.mapper.StrConstant.EMPTY;
import static cn.org.atool.fluent.mybatis.utility.MybatisUtil.notNull;

/**
 * 查询条件封装
 *
 * @param   对应的实体类
 * @param   更新器或查询器
 * @param  对应的嵌套查询器
 * @author darui.wu
 */
@SuppressWarnings({"rawtypes"})
public abstract class BaseWrapper<
    E extends IEntity,
    W extends IWrapper,
    NQ extends IBaseQuery
    >
    implements IWrapper {
    private static final long serialVersionUID = 2674302532927710150L;

    @Getter
    protected Supplier table;
    /**
     * 表别名
     */
    @Getter
    protected String tableAlias;

    @Getter
    protected WrapperData wrapperData;

    protected BaseWrapper(String tableAlias) {
        this.tableAlias = tableAlias;
    }

    protected BaseWrapper(Supplier table, String tableAlias, Class entityClass, Class queryClass) {
        this(table, tableAlias, new Parameters(), entityClass, queryClass);
    }

    protected BaseWrapper(Supplier table, String tableAlias, Parameters parameters, Class entityClass,
        Class queryClass) {
        notNull(entityClass, "entityClass must not null,please set entity before use this method!");
        this.table = table;
        this.tableAlias = isBlank(tableAlias) ? EMPTY : tableAlias.trim();
        this.wrapperData = new WrapperData(table, this.tableAlias, parameters, entityClass, queryClass);
    }

    /**
     * 返回字段映射关系
     *
     * @return 字段映射关系
     */
    protected IMapping mapping() {
        return null;
    }

    /**
     * 返回指定类型字段名称
     * 如果没有指定类型字段,返回null
     *
     * @return 指定类型的字段
     */
    public String fieldName(FieldType type) {
        IMapping mapping = this.mapping();
        if (mapping == null) {
            return null;
        } else {
            return mapping.findField(type).map(c -> c.column).orElse(null);
        }
    }

    /**
     * 表所有字段列表
     *
     * @return 所有字段
     */
    protected abstract List allFields();

    protected TableMeta getTableMeta() {
        return TableMetaHelper.getTableInfo(this.getWrapperData().getEntityClass());
    }

    /**
     * 给字段名称追加上表别名
     *
     * @param column 字段
     * @return taleAlias.column
     */
    protected String appendAlias(String column) {
        return Column.column(column, this).wrapColumn();
    }

    /**
     * 通过Wrapper直接设置变量共享关系
     *
     * @param parameters 参数
     */
    protected void sharedParameter(Parameters parameters) {
        this.wrapperData.getParameters().sharedParameter(parameters);
    }

    /**
     * 通过Wrapper直接设置变量共享关系
     *
     * @param wrapper BaseWrapper
     */
    protected void sharedParameter(BaseWrapper wrapper) {
        this.wrapperData.getParameters().sharedParameter(wrapper.getWrapperData().getParameters());
    }

    /**
     * 返回字段对应的column映射
     *
     * @param column 数据库字段名称
     * @return 字段映射
     */
    public FieldMapping column(String column) {
        return this.column2mapping().get(column);
    }

    /**
     * 数据库类型
     *
     * @return DbType
     */
    public abstract DbType dbType();

    /**
     * 返回字段映射关系
     *
     * @return 字段映射
     */
    protected Map column2mapping() {
        return new HashMap<>();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy