codecamp

HasorDB 自定义类型处理器

开发处理器​

某些数据类型的写入需要特殊处理,例如将字符串数据按照某种格式转换成为时间日期类型。这就需要用到 ​TypeHandler​。

例如,数据库中保存的是时间类型,需要将其读取成格式为​ yyyy-MM-dd​ 的字符串。

@Table(mapUnderscoreToCamelCase = true)
public class TestUser {
    @Column(typeHandler = MyDateTypeHandler.class)
    private String myTime;

    // getters and setters omitted
}

类型读写器为:

public class MyDateTypeHandler extends AbstractTypeHandler<String> {
    public void setNonNullParameter(PreparedStatement ps, int i,
                    String parameter, Integer jdbcType) {

        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(parameter);
        ps.setTimestamp(i, new Timestamp(date.getTime()));
    }

    public String getNullableResult(ResultSet rs, String columnName) {
        return fmtDate(rs.getTimestamp(columnIndex));
    }

    public String getNullableResult(ResultSet rs, int columnIndex) {
        return fmtDate(rs.getTimestamp(columnIndex));
    }

    public String getNullableResult(CallableStatement cs, int columnIndex) {
        return fmtDate(cs.getTimestamp(columnIndex));
    }

    private String fmtDate(Timestamp sqlTimestamp) {
        if (sqlTimestamp != null) {
            Date date = new Date(sqlTimestamp.getTime());
            return new SimpleDateFormat("yyyy-MM-dd").format(date);
        }
        return null;
    }
}
HasorDB 内置了 60 多个 TypeHandler,基本涵盖了各种情况以及数据类型。详细的信息请看 类型处理器 相关章节。

绑定到 Jdbc Type​

将类型处理器绑定到 ​Types.VARCHAR​ 上

TypeHandlerRegistry.DEFAULT.register(Types.VARCHAR, new MyTypeHandler());

下面代码使用注解方式和上面是等效的

@MappedJdbcTypes(Types.VARCHAR)
public class MyTypeHandler extends AbstractTypeHandler<String> {
    ...
}

// 注册处理器
TypeHandlerRegistry.DEFAULT.register(MyTypeHandler.class, new MyTypeHandler());

TypeHandlerRegistry.DEFAULT​ 是全局类型处理器注册中心,如需要特殊定制可以 ​new ​一个。

绑定到 Java Type​

将类型处理器绑定到 ​StringBuilder ​类型上

TypeHandlerRegistry.DEFAULT.register(StringBuilder.class, new MyTypeHandler());

下面代码使用注解方式和上面是等效的

@MappedJavaTypes(StringBuilder.class)
public class MyTypeHandler extends AbstractTypeHandler<String> {
    ...
}

// 注册处理器
TypeHandlerRegistry.DEFAULT.register(MyTypeHandler.class, new MyTypeHandler());

交叉绑定​

只有当 Java类型为 ​InputStream ​并且 ​Jdbc Type​ 为 ​Types.BIGINT​ 时

TypeHandlerRegistry.DEFAULT.registerCross(
            Types.BIGINT, InputStream.class, new MyTypeHandler());

下面代码使用注解方式和上面是等效的

@MappedCross(
        javaTypes = @MappedJavaTypes(InputStream.class), 
        jdbcType = @MappedJdbcTypes(Types.BIGINT))
public class MyTypeHandler extends AbstractTypeHandler<String> {
    ...
}

// 注册处理器
TypeHandlerRegistry.DEFAULT.register(MyTypeHandler.class, new MyTypeHandler());


HasorDB 处理枚举类型
附录:类型映射
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }