ResultSetMetaData используя MyBatis - PullRequest
       9

ResultSetMetaData используя MyBatis

0 голосов
/ 12 февраля 2019

Как я могу получить ResultSetMetaData, используя MyBatis.Я не могу использовать INFORMATION_SCHEMA.columns, поскольку у меня сложный динамический запрос, объединяющий несколько таблиц.Например, мне нужно Количество записей (это я могу получить на основе размера списка), Список столбцов и тип данных каждого столбца.Я много просмотрел и не нашел правильных способов его использования.

Пожалуйста, предложите правильный способ получить ResultSetMetaData либо с TypeHandler, либо с некоторыми другими вариантами с небольшим примером?

Iесть 2 сценария.

  1. Сценарий 1:

    Мой запрос читает файл, используя сервис Abinitio QueryIt (Он рассматривает файлы, подобные таблице, и может использовать запрос SQL для чтения).Эти файлы получены из различных восходящих потоков и не фиксированного набора столбцов.Это может быть число столбцов N и любой тип данных.После того, как мой запрос прочитает данные из файла, он будет отправлен в пользовательский интерфейс для отображения в Grid с форматированным выводом, основанным на типе данных (Integer, Double, String, Date) для просмотра пользователем.Чтобы построить Grid-модель, мне нужно знать количество столбцов и тип данных (для форматирования).Пока я не знаю Количество столбцов и Тип данных каждого столбца, я не могу построить модель сетки.Тип возвращаемого значения моего преобразователя будет List<Map<String, Object>>.

  2. Сценарий 2 (для другого процесса): Как и в предыдущем методе, запрос считывает данные из нескольких таблиц вместочтение из файла на основе выбора критериев из пользовательского интерфейса.Здесь также число столбцов является динамическим для сетки на основе выбора из пользовательского интерфейса.Следовательно, мне нужно количество столбцов и тип данных каждого столбца.Тип возврата такой же, как и выше.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете написать пользовательский TypeHanlder, который расширяет BaseTypeHandler, что даст вам доступ к ResultSetMetaData.Ранее я написал такой обработчик для преобразования Date в LocalDate.Это немного похоже на ваш ответ, потому что маппер не будет напрямую возвращать List<Map<String, Object>>, но это может быть свойство возвращаемого вами объекта.

@MappedTypes(LocalDate.class)
public class DbLocalDateTypeHandler extends BaseTypeHandler<LocalDate> {
      @Override
        public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType) throws SQLException {
            if (parameter == null) {
                ps.setDate(i, null);
            } else {
                ps.setDate(i, Date.valueOf(parameter));
            }
        }

        @Override
        public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException {
            Date date = rs.getDate(columnName);
            if (date != null) {
                return date.toLocalDate();
            }
            return null;
        }

        @Override
        public LocalDate getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            Date date = rs.getDate(columnIndex);
            if (date != null) {
                return date.toLocalDate();
            }
            return null;
        }

        @Override
        public LocalDate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            Date date = cs.getDate(columnIndex);
            if (date != null) {
                return date.toLocalDate();
            }
            return null;
        }
}

Тогда в вашем resultMap вам просто нужно сослаться на этот обработчик:

<result column="CREATE_DATE" jdbcType="DATE" property="createDate" typeHandler="com.company.core.framework.db.DbLocalDateTypeHandler"/>

Наконец, если вам не нужен ResultSetMetaData, вы можете заняться созданием пользовательскогоObjectFactory.

например, Как вернуть необязательный запрос из MyBatis

Полезные документы MyBatis:

http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers

http://www.mybatis.org/mybatis-3/configuration.html#objectFactory

0 голосов
/ 12 февраля 2019

Для сложных запросов вы можете добавить пользовательские мапперы.Обычно я создаю расширенные средства отображения в отдельных каталогах, чтобы они не заменялись при повторной генерации.Кроме того, это сохраняет все пользовательские SQL вместе.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.company.core.app.db.mapper.custom.SomethingExtendedMapper">

    <resultMap id="SomethingMap" type="com.company.core.app.db.Something">
        <result column="ID" jdbcType="INTEGER" property="somethingId" />
        <result column="LAST_CHANGE_DATE" jdbcType="DATE"  property="lastChangeDate"
        ...
    </resultMap>

    <select id="getSomething" resultMap="SomethingMap" parameterType="Integer">
        select
        *
        from
        something
        join something else...
        WHERE SOMETHING_ID = #{id}
    </select>
 </mapper>

Тогда это будет интерфейс:

public interface SomethingExtendedMapper {
    public List<Something> getSomething(@Param("id") Integer id);
}
...