java - 在 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 文档很不清楚,我不确定这是否是正确的。
我如何映射我的结果的方式是这样做的“标准”方式还是有更好/更有效的方式?
谢谢
解决方案
我将添加@winson 推荐的内容。jdbi3-json
是一个很棒的插件,但据我所知,它没有为RowMapper
s 提供任何东西。
我发现这种解决方法并不是那么干净,但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")
);
}
推荐阅读
- python - 无法导入 FieldValue.arrayUnion
- c# - 测试完成 12.0 连接到 pid
- r - 数据帧的 dcast(reshape2 包)错误
- excel - 有什么办法可以在 VBA excel 中压缩此代码?也许使用循环或函数
- assembly - NASM 是否在 32 位 x86 生成的机器指令中包含段寄存器?
- selenium - Selenium 节点未回复 /status HTTP-Request
- html - 在列框上对齐图像的一半
- office-js - 如何尝试 OfficeJs 中设置的预览要求
- c# - 如何通过提供一个单一的 int 值而不是一直更改所有值来更改图像大小?
- excel - 上传 Excel 到 TFS,上传描述信息的问题