首页 > 解决方案 > 在 JDBI RowMapper 中映射 Json

问题描述

我将 JDBI v 3.11.1 与 Amazon Aurora(和 Jackson)一起使用。在我们的表格中,我们经常使用 JSonB,我觉得我正在做的映射有点太复杂/太慢了。

目前我有一个 DAO 做这样的事情:

@RegisterRowMapper(ContactMapper.class)
  public interface ContactsDao {

    @SqlQuery("SELECT * FROM contacts")
    List<Contact> listContacts();
}

而映射器做这样的事情:(精简到这个问题需要什么)

public class ContactMapper implements RowMapper<Contact> {

  private final ObjectMapper objectMapper = new ObjectMapper();

  @Override
  public Contact map(ResultSet r, StatementContext ctx) throws SQLException {

    Address address = r.getString("address") == null ? null : (Address) mapJson(r.getString("address"), Address.class);

    return new Contact(
        r.getString("id"),
        address
    );
  }

  private Object mapJson(String json, Class clazz) {
    if (Strings.isNullOrEmpty(json)) {
      return null;
    }
    try {
      return objectMapper.readValue(json, clazz);
    } catch (IOException e) {
      LOGGER.error("Could not map Address.", e);
      return null;
    }
  }
}

Address作为 JsonB 字段存储在 Aurora 中。我读过一些关于JsonMapper注释的东西,但由于 jdbi 文档很不清楚,我不确定这是否是正确的。

我如何映射我的结​​果的方式是这样做的“标准”方式还是有更好/更有效的方式?

谢谢

标签: javadatabasejdbiamazon-aurora

解决方案


我将添加@winson 推荐的内容。jdbi3-json是一个很棒的插件,但据我所知,它没有为RowMappers 提供任何东西。

我发现这种解决方法并不是那么干净,但ObjectMapper如果您使用jdbi3-json.

public Contact map(ResultSet r, StatementContext ctx) throws SQLException {
    var addressMapper = (ColumnMapper<Address>) new JsonColumnMapperFactory()
        .build(Address.class, ctx.getConfig()).orElseThrow();
    return new Contact(
        r.getString("id"),
        addressMapper.map("address")
    );
}

推荐阅读