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.

  1. Как узнать тип выражения, в которое я пытаюсь вставить данные? Если это String Я сделаю встроенный вызов связывания ResultSet.getString("expr") и скажи Орике использовать java.lang.String, Если это временная метка, я сделаю вызов встроенной привязки Resulset.getTimestamp("expr") и скажи Орике использовать Timestamp
  2. Откуда я знаю, что я пытаюсь нанести на карту ResultSet в InternalTestPojo по сравнению, например, Map в InternalTestPojo?

1 ответ

Решение

Я думаю, что самый простой способ добиться того, что вам нужно сделать, - это использовать пользовательский конструктор карт классов, расширяющий стандартный, поэтому вы можете автоматически добавлять поля в карту классов, переопределяя метод Default.

Это простой пример использования аннотаций с Orika: https://gist.github.com/elaatifi/5212119

Вам не нужно использовать Reflection, вы можете использовать PropertyResolver, чтобы найти все свойства InternalTestPojo, и для каждого из них построить часть счетчика для ResultSet и добавить ее на карту классов.

Для построения свойства встречной части вы можете использовать Property.Builder. Метод получения для свойства может быть заключен из типа.

Надеюсь, что это может помочь!

Другие вопросы по тегам