使用自定义类型的JDBI教程

259 阅读1分钟

我最近一直在使用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,我可能会在某个时候这么做。