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

org.test4j.module.database.enviroment.TableMeta Maven / Gradle / Ivy

There is a newer version: 1.1.2
Show newest version
package org.test4j.module.database.enviroment;

import lombok.Getter;
import org.test4j.tools.datagen.IDataMap;

import java.sql.ResultSetMetaData;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static java.util.stream.Collectors.toSet;

@SuppressWarnings({"unchecked", "rawtypes"})
public class TableMeta {
    /**
     * 表名
     */
    String tableName;

    Map columns;
    /**
     * 自增pk字段
     */
    ColumnMeta pkMeta;

    public TableMeta(String table, ResultSetMetaData meta) throws Exception {
        this.tableName = table;
        this.columns = new HashMap<>();
        int count = meta.getColumnCount();
        for (int index = 1; index <= count; index++) {
            ColumnMeta columnMeta = new ColumnMeta();

            columnMeta.columnName = meta.getColumnName(index);
            columnMeta.size = meta.getColumnDisplaySize(index);
            columnMeta.typeName = meta.getColumnTypeName(index);
            columnMeta.isNullable = meta.isNullable(index) == ResultSetMetaData.columnNullable;

            columnMeta.javaType = meta.getColumnClassName(index);
            // dbEnvironment.getJavaClass(columnMeta.typeName);
            columnMeta.autoIncrement = meta.isAutoIncrement(index);

            if (columnMeta.autoIncrement) {
                pkMeta = columnMeta;
            }
            this.columns.put(columnMeta.columnName, columnMeta);
        }
    }

    /**
     * 返回主键字段
     *
     * @return 主键字段
     */
    public String getPkColumn() {
        if (pkMeta != null) {
            return pkMeta.columnName;
        } else {
            return null;
        }
    }

    public Map getColumns() {
        return columns;
    }

    /**
     * 将string转换为对应的java对象
     *
     * @param column column name
     * @return java type name
     */
    public String getColumnType(String column) {
        ColumnMeta meta = this.getColumns().get(column);
        if (meta == null) {
            throw new RuntimeException("can't find column[" + column + "] field in table[" + tableName + "].");
        }

        return meta.javaType;
    }

    /**
     * 返回字段的长度
     *
     * @param column column name
     * @return length of column
     */
    public int getColumnSize(String column) {
        ColumnMeta meta = this.getColumns().get(column);
        if (meta == null) {
            throw new RuntimeException("can't find column[" + column + "] field in table[" + tableName + "].");
        }

        return meta.size;
    }

    /**
     * 根据数据库字段的最大长度,截断插入的值
     *
     * @param column column name
     * @param input  value of column
     * @return truncated value
     */
    public String truncateString(String column, String input) {
        if (input == null) {
            return null;
        }
        int size = this.getColumnSize(column);
        if (size > input.length()) {
            return input;
        } else {
            return input.substring(0, size);
        }
    }

    /**
     * 填充空缺字段
     * 自增字段和可空字段不处理
     *
     * @param data        IDataMap
     * @param environment DBEnvironment
     */
    public void fillData(IDataMap data, DBEnvironment environment) {
        Set keys = ((Set) data.keySet()).stream()
            .map(String::toUpperCase)
            .collect(toSet());
        for (String key : this.columns.keySet()) {
            if (keys.contains(key.toUpperCase())) {
                continue;
            }
            ColumnMeta column = this.columns.get(key);
            if (column.autoIncrement || column.isNullable) {
                continue;
            }
            Object value = column.getDefaultValue(environment);
            data.kv(key, value);
        }
    }

    public static class ColumnMeta {
        /**
         * 字段名称
         */
        String columnName;
        /**
         * 字段大小
         */
        int size;
        /**
         * 字段类型名称
         */
        String typeName;
        /**
         * 是否允许null?
         */
        @Getter
        boolean isNullable;

        /**
         * 对应的java类型
         */
        String javaType;
        /**
         * 是否自增
         */
        @Getter
        boolean autoIncrement;

        @Override
        public String toString() {
            return "[columnName=" + columnName + ", size=" + size + ", typeName=" + typeName + ", isNullable="
                + isNullable + "]";
        }

        public Object getDefaultValue(DBEnvironment dbEnvironment) {
            if (this.isNullable()) {
                return null;
            }

            if ("java.lang.String".equals(javaType)) {
                return "test4j".subSequence(0, Math.min(size, 6));
            } else {
                return dbEnvironment.getDefaultValue(javaType);
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy