package jef.database.dialect; import java.util.Map; import jef.database.dialect.type.ColumnMapping; import jef.database.dialect.type.UnknownStringMapping; import jef.tools.reflect.BeanUtils; /** * 一个数据库类型的定义,将逐渐此类代替原来ColumnType中的子类。 * @author jiyi * */ public class TypeDefImpl extends ColumnType implements SqlTypeSized { /** * 类型的名称 数据库中的SQL名称。可以为null。 * 为null时根据sqlType从方言自动生成 */ private String name; /** * JDBC类型 */ private int sqlType; /** * 长度 */ private int length; /** * 长度(数字) */ private int precision; /** * 精度 */ private int scale; /** * 对应的java数据类型 */ private Class<?> javaType = String.class; /** * 映射规则类 */ private Class<? extends ColumnMapping> mappingClz; /** * 构造 * @param name * @param sqlType * @param length * @param p * @param s */ public TypeDefImpl(String name, int sqlType) { this.name = name; this.sqlType = sqlType; } /** * 和数据库中的列进行比较 */ @Override protected boolean compare(ColumnType type, DatabaseDialect profile) { return true; } @Override protected void putAnnonation(Map<String, Object> map) { if (!nullable) map.put("nullable", java.lang.Boolean.FALSE); map.put("columnDefinition", name); } @Override public Class<?> getDefaultJavaType() { return javaType; } @Override public ColumnMapping getMappingType(Class<?> fieldType) { if (mappingClz != null) { return BeanUtils.newInstance(mappingClz); } else if (fieldType == String.class) { return new UnknownStringMapping(name, sqlType); } else { throw new UnsupportedOperationException("can not support mapping from [" + fieldType.getName() + " -> " + name + "]"); } } public String getName() { return name; } public int getSqlType() { return sqlType; } public int getLength() { return length; } public int getPrecision() { return precision; } public int getScale() { return scale; } public TypeDefImpl setName(String name) { this.name = name; return this; } public TypeDefImpl setSqlType(int sqlType) { this.sqlType = sqlType; return this; } public TypeDefImpl setLength(int length) { this.length = length; return this; } public TypeDefImpl setPrecision(int precision) { this.precision = precision; return this; } public TypeDefImpl setScale(int scale) { this.scale = scale; return this; } public TypeDefImpl javaType(Class<?> javaType) { this.javaType=javaType; return this; } public TypeDefImpl mapping(Class<? extends ColumnMapping> mappingClz) { this.mappingClz = mappingClz; return this; } public TypeDefImpl spec(int length,int p,int s){ this.length=length; this.precision=p; this.scale=s; return this; } }