org.test4j.module.database.enviroment.TableMeta Maven / Gradle / Ivy
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);
}
}
}
}