JDBI With Custom Types
I’ve been using JDBI recently for interacting with a database in Java and I generally like it. It
lets you write explicit queries, and it is relatively simple to map results back into objects (e.g. using
@BindMethods
).
However, one thing that is not super straightforward is how to make it work with custom types. For example, I’ve been
playing with ULIDs lately as identifiers (specifically
f4b6a3/ulid-creator), and I want those stored in TEXT
columns in the
database. It took me a while to figure out the necessary pieces.
In short, you need both an ArgumentFactory
(for custom type -> db) and a ColumnMapper
(for db -> custom type). It
looks like this:
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));
}
});
With those two registrations in place, everything else should just work. These could even be bundled together into a
JdbiPlugin
, which I might do at some point.