Skip to content

类型映射


title: 类型映射 description:

特定场景下,需要自定义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();

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

java
@Component
public class MyJavaTypeToDatabaseTypeConverter implements JavaTypeToDatabaseTypeConverter {
    /**
     * 初始化完成回调
     */
    @Override
    public Class<?> getFieldType(final Class<?> clazz, final Field field) {
        // 根据 类、字段 进行判断,返回对应数据库类型
        if (clazz.getName().equals("com.example.entity.User") && field.getName().equals("createTime")) {
            return MySqlDefaultTypeEnum.TIMESTAMP;
        }
        // 返回null代表,不介入自定义类型的逻辑
        return null;
    }
}
java
// 自定义java类型与数据库类型映射关系
AutoTableGlobalConfig.setJavaTypeToDatabaseTypeConverter(new JavaTypeToDatabaseTypeConverter() {
    @Override
    public Class<?> getFieldType(Class<?> clazz, Field field) {
        // 根据 类、字段 进行判断,返回对应数据库类型
        if (clazz.getName().equals("com.example.entity.User") && field.getName().equals("createTime")) {
            return MySqlDefaultTypeEnum.TIMESTAMP;
        }
        // 返回null代表,不介入自定义类型的逻辑
        return null;
    }
});
// 开始
AutoTableBootstrap.start();

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

java
public class MyJavaTypeToDatabaseTypeConverter implements JavaTypeToDatabaseTypeConverter {
    /**
     * 初始化完成回调
     */
    @Override
    public DatabaseTypeAndLength convert(String databaseDialect, Class<?> clazz, Field field) {
        
        // 根据 数据源类型、类、字段 进行判断,返回对应数据库类型
        ......
        
        // 返回null代表,不介入自定义类型的逻辑
        return null;
    }
}