Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package my.example.mybatis.handler;
- import org.apache.ibatis.executor.statement.StatementHandler;
- import org.apache.ibatis.mapping.BoundSql;
- import org.apache.ibatis.plugin.Interceptor;
- import org.apache.ibatis.plugin.Intercepts;
- import org.apache.ibatis.plugin.Invocation;
- import org.apache.ibatis.plugin.Signature;
- import java.sql.Connection;
- import java.sql.Statement;
- @Intercepts({
- @Signature(
- type = StatementHandler.class,
- method = "prepare", // "prepare" - стадия подготовки запроса (из StatementHandler)
- args = { // StatementHandler#prepare(
- Connection.class, // Connection connection,
- Integer.class // Integer transactionTimeout
- // )
- }
- )
- })
- public class DynamicQueryParamInterceptor implements Interceptor {
- // Если не работаем с динамикой, то можем использовать просто константу
- private static final String DYNAMIC_QUERY_PARAM = "value";
- @Override
- public Object intercept(Invocation invocation) throws Throwable {
- // Какие именно у нас есть аргументы - смотрим в @Signature#args
- final Connection connection = (Connection) invocation.getArgs()[0];
- // 1. Получение аргументов из вызова
- final String dynamicQueryParam = getDynamicQueryParam(invocation);
- // Используем SET setting = %s для Clickhouse
- final String dynamicQueryParamQuery = "SET setting TO %s".formatted(dynamicQueryParam);
- // 2. Получение постоянного значения
- final String dynamicQueryParamConstant = DYNAMIC_QUERY_PARAM;
- // Используем SET setting = %s для Clickhouse
- final String dynamicQueryParamConstantQuery = "SET setting TO %s".formatted(dynamicQueryParamConstant);
- // 3. Получение параметра из холдера контекста запроса
- final String dynamicQueryParamContext = getDynamicQueryParamThreadLocal();
- // Используем SET setting = %s для Clickhouse
- final String dynamicQueryParamContextQuery = "SET setting TO %s".formatted(dynamicQueryParamContext);
- try (final Statement statement = connection.createStatement()) {
- statement.execute("dynamicQueryParam");
- }
- return invocation.proceed();
- }
- // Необязательный метод
- @Override
- public Object plugin(Object target) {
- // Оборачиваем целевой объект в интерсептор
- return Plugin.wrap(target, this);
- }
- // Необязательный метод
- @Override
- public void setProperties(Properties properties) {
- // Можем так же читать свойства из конфигурации
- this.setting = properties.getProperty("setting", "default_value");
- }
- // 1. Получение аргументов из вызова (модель)
- private String getDynamicQueryParam(Invocation invocation) {
- final BoundSql boundSql = (BoundSql) invocation.getTarget();
- final Object parameterObject = boundSql.getParameterObject();
- if (parameterObject instanceof SomeParams someParams) {
- return someParams.getValue();
- }
- // Или любое другое значение по дефолту
- return null;
- }
- // 3. Получение параметра из холдера контекста запроса
- private String getDynamicQueryParamThreadLocal() {
- // До этого где-нибудь в сервисе заполняем ThreadLocal в DynamicQueryContextHolder
- return DynamicQueryContextHolder.getDynamicQueryParam();
- }
- // Наш холдер контекста запроса, можем использовать его в любых местах, если нужна динамика в параметре
- static class DynamicQueryContextHolder {
- private static final ThreadLocal<String> DYNAMIC_QUERY_PARAM_CONTEXT_HOLDER = new ThreadLocal<>();
- public static void setDynamicQueryParam(String dynamicQueryParam) {
- DYNAMIC_QUERY_PARAM_CONTEXT_HOLDER.set(dynamicQueryParam);
- }
- public static String getDynamicQueryParam() {
- return DYNAMIC_QUERY_PARAM_CONTEXT_HOLDER.get();
- }
- public static void clear() {
- DYNAMIC_QUERY_PARAM_CONTEXT_HOLDER.remove();
- }
- }
- }
- package my.example.mybatis.model;
- import lombok.Builder;
- import lombok.Getter;
- @Builder
- @Getter
- public class SomeParams {
- private String value;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement