1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/selfly-sonsure-dumper

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
ext-executor.md 6.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 13:43 e04b5c0

Расширение CommandExecutor

Через JdbcDao операции Insert, Select, Update, Delete, nativeExecutor, mybatisExecutor по сути создают реализацию CommandExecutor.

Для вышеупомянутых нескольких встроенных объектов CommandExecutor все они создаются с помощью CommandExecutorBuilderImpl.

Можно реализовать собственный CommandExecutor для интеграции различных способов выполнения.

Логика реализации

Создание CommandExecutor происходит в CommandExecutorFactory, CommandExecutorFactory отвечает за поиск соответствующего CommandExecutorBuilder и создание конкретного объекта CommandExecutor.

А информация о контексте команды, необходимая для выполнения CommandExecutor, создаётся его внутренним CommandContextBuilder при создании CommandExecutor. Необходимо указать используемый CommandContextBuilder во время создания CommandExecutor.

Пример

Здесь мы расширяем команду count CommandExecutor для специального запроса количества записей таблицы.

Конечный способ вызова выглядит следующим образом:

// Пользовательский CountCommandExecutor, передаём класс сущности для получения количества записей
long count = jdbcDao.executor(CountCommandExecutor.class)
            .clazz(UserInfo.class)
            .getCount();

В целом, реализация CountCommandExecutor требует следующих классов:

  • CountCommandExecutor интерфейс и класс реализации CountCommandExecutorImpl;
  • класс CountCommandExecutorBuilderImpl, отвечающий за создание CountCommandExecutor;
  • класс CountCommandContextBuilder, отвечающий за построение контекста команды;
  • класс CountExecutorContext для хранения некоторых данных в процессе создания CountCommandExecutor, аналогично объекту сущности.

Код класса CountCommandExecutor:

public interface CountCommandExecutor extends CommandExecutor {

    CountCommandExecutor clazz(Class<?> clazz);

    long getCount();
}

Реализация класса:

public class CountCommandExecutorImpl implements CountCommandExecutor {

    private JdbcEngineConfig jdbcEngineConfig;

    private CommandContextBuilder commandContextBuilder;

    private CountExecutorContext countExecutorContext;

    public CountCommandExecutorImpl(JdbcEngineConfig jdbcEngineConfig) {
        this.jdbcEngineConfig = jdbcEngineConfig;
        countExecutorContext = new CountExecutorContext();
    }

    @Override
    public CountCommandExecutor clazz(Class<?> clazz) {
        this.countExecutorContext.setClazz(clazz);
        return this;
    }

    @Override
    public long getCount() {
        CommandContext commandContext = this.commandContextBuilder.build(this.countExecutorContext, this.jdbcEngineConfig);
        PersistExecutor persistExecutor = this.jdbcEngineConfig.getPersistExecutor();
        commandContext.setResultType(Long.class);
        Object result = persistExecutor.execute(commandContext, CommandType.QUERY_ONE_COL);
        return (Long) result;
    }

    public void setCommandContextBuilder(CommandContextBuilder commandContextBuilder) {
        this.commandContextBuilder = commandContextBuilder;
    }
}

Код CountCommandExecutorBuilderImpl:

public class CountCommandExecutorBuilderImpl extends AbstractCommandExecutorBuilder {

    @Override
    public boolean support(Class<? extends CommandExecutor> commandExecutorClass, JdbcEngineConfig jdbcEngineConfig) {
        return commandExecutorClass == CountCommandExecutor.class;
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T extends CommandExecutor> T build(Class<T> commandExecutorClass, JdbcEngineConfig jdbcEngineConfig) {
        CountCommandExecutorImpl commandExecutor = new CountCommandExecutorImpl(jdbcEngineConfig);
        return (T) commandExecutor;
    }
}

Код CountCommandContextBuilder:

public class CountCommandContextBuilder extends AbstractCommandContextBuilder {

    public CountCommandContextBuilder(CommandContextBuilderContext commandContextBuilderContext) {
        super(commandContextBuilderContext);
    }

    @Override

    public CommandContext doBuild(JdbcEngineConfig jdbcEngineConfig) {
        Class<?> clazz = this.getCommandContextBuilderContext().getUniqueModelClass();
        CommandContext commandContext = new CommandContext();
        commandContext.setCommand("select count(*) from " + clazz.getSimpleName());
        return commandContext;
    }
}

Конфигурация

После реализации кода выше необходимо настроить наш пользовательский CommandExecutor при объявлении JdbcDao, в основном настройка следующая, здесь явно объявлен CommandExecutorFactoryImpl и наш реализованный CountCommandExecutorBuilderImpl включён в инициализацию:

<bean id="commandExecutorFactory" ```

class="com.sonsure.dumper.core.config.CommandExecutorFactoryImpl">

```

Наконец

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

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/selfly-sonsure-dumper.git
git@api.gitlife.ru:oschina-mirror/selfly-sonsure-dumper.git
oschina-mirror
selfly-sonsure-dumper
selfly-sonsure-dumper
master