Расширение 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:
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 )