Как использовать параметризованный класс как resultClass в iBATIS - PullRequest
4 голосов
/ 28 сентября 2011

У нас есть следующий класс

public class TemporalData<T> {
    private T data;
    private String opCode;
    private Date updateTime;
    // getters, setters
}

public class Employee {
    private String name;
    private int age;
    private Date dob;
    // getters, setters
}

И скажем, у нас есть таблица employee_log со всеми полями employee и парой дополнительных столбцов (opCode, updateTime)

Предположим, что этошаблон для всех журнальных таблиц, где у нас есть несколько дополнительных столбцов (в данном случае opCode, updateTime), мы хотели бы иметь один единственный класс, который может обслуживать все временные данные и, следовательно, параметризованный класс.

Теперь,Если нам нужно выбрать сотрудников, чьи атрибуты изменились за определенный период времени, и хотели бы иметь объекты типа TemporalData, возвращаемые уровнем DAO, может кто-нибудь объяснить, как реализовать iBatis TypeHandler для обработки этого случая?Как настроить обработчик типа в файлах sqlmap xml?

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Нужно узнать гораздо лучшее и более простое решение от одного из моих коллег.

<resultMap class="Employee" id="employee">
    <result property="name" column="name"/>
    <result property="age" column="age"/>
    <result property="bidPrice" column="bid_price"/>
    <result property="dob" column="dob"/>
</resultMap>

<resultMap class="Temporal" id="temporalEmployee">
    <result property="data" resultMap="employee"/>
    <result property="opCode" column="opCode" javaType="String"/>
    <result property="updateTime" column="updateTime" javaType="java.util.Date"/>
</resultMap>

Приведенный выше подход будет хорошо работать без каких-либо дополнительных компонентов.

2 голосов
/ 29 сентября 2011

После долгого изучения классов ibatis в нескольких пакетах у меня сработал следующий подход. (не удалось найти ни документации, касающейся этого подхода, ни содержания в единственной книге, доступной для ibatis - ibatis in action)

Шаг 1: Добавьте пользовательский ResultObjectFactory. Classdoc интерфейса ResultObjectFactory объясняет, что это такое и как оно ведет себя.

public class TemporalDataResultObjectFactory implements ResultObjectFactory {

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactory#createInstance
     * (java.lang.String, java.lang.Class)
     */
    @Override
    public Object createInstance(String statementId,
            @SuppressWarnings("rawtypes") Class clazz)
            throws InstantiationException, IllegalAccessException {

        if (!statementId.startsWith("_td_")) {
            return null;
        }

        TemporalData<Object> temporalResult = new TemporalData<Object>();
        Object dataObject = clazz.newInstance();
        temporalResult.setData(dataObject);

        return temporalResult;
    }
    /*
     * (non-Javadoc)
     * 
     * @see
     * com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactory#setProperty
     * (java.lang.String, java.lang.String)
     */
    @Override
    public void setProperty(String arg0, String arg1) {
        // TODO Auto-generated method stub

    }

}

Шаг 2. Добавьте вышеуказанный ResultObjectFactory в sql-map-config

<resultObjectFactory type="TemporalDataResultObjectFactory" />

Шаг 3: Добавьте все ваши идентификаторы операторов ibatis, результатом которых являются временные данные, с ' td '.

пример:

<select id="_td_getTemporalEmployees" resultMap="temporalEmployee">
    SELECT  name, age, opCode, updateTime
    FROM    employee 
    WHERE   updateTime BETWEEN #startTime# AND #endTime#
</select>

Шаг 4: Определите карту результата с фактическим классом (например: если вы хотите, чтобы результатом был TemporalData, затем установите класс 'Employee'), но со свойствами согласно классу temporalData.

пример:

<resultMap class="Employee" id="temporalEmployee">
    <result property="data.name" column="name" javaType="String"/>
    <result property="data.age" column="age"  javaType="long"/>
    <result property="data.bidPrice" column="bid_price"  javaType="int"/>
    <result property="data.dob" column="dob" javaType="java.util.Date"/>
    <result property="opCode" column="opCode" javaType="String"/>
    <result property="updateTime" column="updateTime" javaType="java.util.Date"/>
</resultMap>

Шаг 5. Убедитесь, что для всех свойств в resultMap, определенных выше, правильно задан javaType (в противном случае ibatis выдает исключения во время проверок, жалующихся на недоступные сеттеры)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...