Orika mapping jdbc ResultSet Bean
Я хочу, чтобы мой уровень Java общался с моей БД с помощью хранимых процедур. Хранимые процедуры действуют как слой совместимости, поэтому я могу запускать две разные версии приложения, ожидая две разные схемы поверх одной и той же базы данных.
Чтобы сделать это, я хотел использовать Orika для быстрого отображения из JDBC ResultSet в один из моих Бинов.
Я уже написал этот тестовый код: @Test public void testSelectAndMap() throws Exception { Assert.assertNotNull(dataSource); try (Connection con = dataSource.getConnection()) { try(Оператор stmt = con.createStatement()) {
try (ResultSet result = stmt.executeQuery("select 1 as internalTestPojoId, CURRENT_TIMESTAMP as now")) {
result.next();
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.classMap(ResultSet.class, InternalTestPojo.class)
.byDefault()
.field("internalTestPojoId:{getInt('internalTestPojoId')|getInt('internalTestPojoId')|type=" + int.class.getName() + "}", "internalTestPojoId")
.field("now:{getTimestamp('now')|getTimestamp('now')|type=" + Timestamp.class.getName() + "}", "now")
.register();
MapperFacade mapper = mapperFactory.getMapperFacade();
InternalTestPojo pojo = mapper.map(result, InternalTestPojo.class);
Assert.assertEquals(pojo.internalTestPojoId, 1);
Assert.assertEquals(pojo.now, new Timestamp(new Date().getTime() / 1000 * 1000));
}
Это прекрасно работает, это быстро, но на самом деле это не занимает намного меньше времени, чем написание кода ResultSet to Bean. Но если бы я мог автоматически сгенерировать отображение, это сэкономило бы мне много времени.
я смотрел на IntrospectorPropertyResolver
, Я написал такой код:
protected Property getProperty(java.lang.reflect.Type type, String expr,
boolean isNestedLookup, Property owner) throws MappingException {
Property property = null;
try {
property = super.getProperty(type, expr, isNestedLookup, null);
} catch (MappingException e) {
try {
property = super.resolveInlineProperty(type,
expr + ":{getInt('" + expr + "')|getInt('" + expr + "')|type=" + int.class);
} catch (MappingException subE) {
throw e; // throw the original exception
}
}
return property;
}
Это хорошо, Orika автоматически определяет имя свойства в бобе и дает его мне в expr. Но это не говорит мне тип. И при этом это не говорит мне, что я пытаюсь сопоставить. Я просто должен сделать вид, что в этом случае целью является ResultSet.
- Как узнать тип выражения, в которое я пытаюсь вставить данные? Если это
String
Я сделаю встроенный вызов связыванияResultSet.getString("expr")
и скажи Орике использоватьjava.lang.String
, Если это временная метка, я сделаю вызов встроенной привязкиResulset.getTimestamp("expr")
и скажи Орике использоватьTimestamp
- Откуда я знаю, что я пытаюсь нанести на карту
ResultSet
вInternalTestPojo
по сравнению, например,Map
вInternalTestPojo
?
1 ответ
Я думаю, что самый простой способ добиться того, что вам нужно сделать, - это использовать пользовательский конструктор карт классов, расширяющий стандартный, поэтому вы можете автоматически добавлять поля в карту классов, переопределяя метод Default.
Это простой пример использования аннотаций с Orika: https://gist.github.com/elaatifi/5212119
Вам не нужно использовать Reflection, вы можете использовать PropertyResolver, чтобы найти все свойства InternalTestPojo, и для каждого из них построить часть счетчика для ResultSet и добавить ее на карту классов.
Для построения свойства встречной части вы можете использовать Property.Builder. Метод получения для свойства может быть заключен из типа.
Надеюсь, что это может помочь!