Skip to content

类型映射

特定场景下,需要自定义Java类字段与数据库列之间的类型映射关系

核心类:JavaTypeToDatabaseTypeConverter

JavaTypeToDatabaseTypeConverter抽象了由java类型与数据库列类型之间进行转换的接口,用户可以在该接口中自定义类型映射关系,从而实现自定义类型映射,其内部有一个JAVA_TO_DB_TYPE_MAPPING成员变量,存储了所有数据库的类型映射关系。

java
public interface JavaTypeToDatabaseTypeConverter {

    Logger log = LoggerFactory.getLogger(JavaTypeToDatabaseTypeConverter.class);

    /**
     * 类型映射
     */
    Map<String, Map<Class<?>, DefaultTypeEnumInterface>> JAVA_TO_DB_TYPE_MAPPING = new HashMap<>();
    
    ......
}

方式一:简单添加自定义映射关系

java
@Component
public class AutoTableReadyCallbackListener implements AutoTableReadyCallback {
    /**
     * 初始化完成回调
     */
    @Override
    public void ready(final Set<Class<?>> tableClasses) {
        // 举例:自定义java类型与数据库类型映射关系
        JavaTypeToDatabaseTypeConverter.addTypeMapping(DatabaseDialect.MySQL, Date.class, MySqlDefaultTypeEnum.TIMESTAMP);
    }
}
java
// 自定义java类型与数据库类型映射关系
JavaTypeToDatabaseTypeConverter.addTypeMapping(DatabaseDialect.MySQL, Date.class, MySqlDefaultTypeEnum.TIMESTAMP);
// 开始
AutoTableBootstrap.start();

方式二:简单添加自定义映射关系 ^2.3.4

java
@Component
public class MyJavaTypeToDatabaseTypeConverter implements JavaTypeToDatabaseTypeConverter {
    /**
     * 直接切换指定的数据类型
     */
    @Override
    public DefaultTypeEnumInterface getSqlType(String databaseDialect, Class<?> clazz, Field field) {
        // 根据 类、字段 进行判断,返回对应数据库类型
        if (databaseDialect.equals(DatabaseDialect.MySQL) &&
                clazz.getName().equals("com.example.entity.User") &&
                field.getName().equals("createTime")) {
            return MySqlDefaultTypeEnum.TIMESTAMP;
        }
        // 其他情况执行默认逻辑
        return JavaTypeToDatabaseTypeConverter.super.getSqlType(databaseDialect, clazz, field);
    }
}
java
// 自定义java类型与数据库类型映射关系
AutoTableGlobalConfig.setJavaTypeToDatabaseTypeConverter(new JavaTypeToDatabaseTypeConverter() {
    /**
     * 直接切换指定的数据类型
     */
    @Override
    public DefaultTypeEnumInterface getSqlType(String databaseDialect, Class<?> clazz, Field field) {
        // 根据 类、字段 进行判断,返回对应数据库类型
        if (databaseDialect.equals(DatabaseDialect.MySQL) &&
                clazz.getName().equals("com.example.entity.User") &&
                field.getName().equals("createTime")) {
            return MySqlDefaultTypeEnum.TIMESTAMP;
        }
        // 其他情况执行默认逻辑
        return JavaTypeToDatabaseTypeConverter.super.getSqlType(databaseDialect, clazz, field);
    }
});
// 开始
AutoTableBootstrap.start();

方式三:完全自定义类型映射关系

java
public class MyJavaTypeToDatabaseTypeConverter implements JavaTypeToDatabaseTypeConverter {
    /**
     * 完全自定义类型转换逻辑,包括解析注解的逻辑
     */
    @Override
    public DatabaseTypeAndLength convert(String databaseDialect, Class<?> clazz, Field field) {
        
        // 根据 数据源类型、类、字段 进行判断,返回对应数据库类型
        ......
        
        return new DatabaseTypeAndLength(...);
    }
}
java
// 自定义java类型与数据库类型映射关系
AutoTableGlobalConfig.setJavaTypeToDatabaseTypeConverter(new JavaTypeToDatabaseTypeConverter() {
    /**
     * 完全自定义类型转换逻辑,包括解析注解的逻辑
     */
    @Override
    public DatabaseTypeAndLength convert(String databaseDialect, Class<?> clazz, Field field) {

        // 根据 数据源类型、类、字段 进行判断,返回对应数据库类型
        ......

        return new DatabaseTypeAndLength(...);
    }
});
// 开始
AutoTableBootstrap.start();