HasorDB 自定義類(lèi)型處理器

2021-12-29 14:07 更新

開(kāi)發(fā)處理器?

某些數(shù)據(jù)類(lèi)型的寫(xiě)入需要特殊處理,例如將字符串?dāng)?shù)據(jù)按照某種格式轉(zhuǎn)換成為時(shí)間日期類(lèi)型。這就需要用到 ?TypeHandler?。

例如,數(shù)據(jù)庫(kù)中保存的是時(shí)間類(lèi)型,需要將其讀取成格式為? yyyy-MM-dd? 的字符串。

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

    // getters and setters omitted
}

類(lèi)型讀寫(xiě)器為:

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 內(nèi)置了 60 多個(gè) TypeHandler,基本涵蓋了各種情況以及數(shù)據(jù)類(lèi)型。詳細(xì)的信息請(qǐng)看 類(lèi)型處理器 相關(guān)章節(jié)。

綁定到 Jdbc Type?

將類(lèi)型處理器綁定到 ?Types.VARCHAR? 上

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

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

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

// 注冊(cè)處理器
TypeHandlerRegistry.DEFAULT.register(MyTypeHandler.class, new MyTypeHandler());

?TypeHandlerRegistry.DEFAULT? 是全局類(lèi)型處理器注冊(cè)中心,如需要特殊定制可以 ?new ?一個(gè)。

綁定到 Java Type?

將類(lèi)型處理器綁定到 ?StringBuilder ?類(lèi)型上

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

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

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

// 注冊(cè)處理器
TypeHandlerRegistry.DEFAULT.register(MyTypeHandler.class, new MyTypeHandler());

交叉綁定?

只有當(dāng) Java類(lèi)型為 ?InputStream ?并且 ?Jdbc Type? 為 ?Types.BIGINT? 時(shí)

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

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

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

// 注冊(cè)處理器
TypeHandlerRegistry.DEFAULT.register(MyTypeHandler.class, new MyTypeHandler());


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)