我最近一直在使用JDBI来与Java中的数据库进行交互,我一般都喜欢它。它可以让你写出明确的查询,而且将结果映射到对象中也相对简单(例如,使用@BindMethods).
然而,有一件事不是超级直接的,那就是如何让它与自定义类型一起工作。例如,我最近一直在玩ULIDs作为标识符(特别是f4b6a3/ulid-creator),我想把这些存储在数据库的TEXT 列中。我花了一些时间来弄清必要的部分。
简而言之,你需要一个ArgumentFactory (用于自定义类型->数据库)和一个ColumnMapper (用于数据库->自定义类型)。它看起来像这样:
Jdbi jdbi = ...
jdbi.registerArgument(
new AbstractArgumentFactory<Ulid>(Types.VARCHAR) {
@Override
protected Argument build(Ulid value, ConfigRegistry config) {
return (position, statement, ctx) -> statement.setString(position, value.toString());
}
});
jdbi.registerColumnMapper(
new ColumnMapper<Ulid>() {
@Override
public Ulid map(ResultSet r, int columnNumber, StatementContext ctx) throws SQLException {
return Ulid.from(r.getString(columnNumber));
}
});
有了这两个注册,其他的东西都应该可以工作。这些甚至可以被捆绑在一起,成为一个JdbiPlugin,我可能会在某个时候这么做。