2025년 3월 11일 화요일

custom interceptor

 import org.apache.ibatis.executor.statement.StatementHandler;

import org.apache.ibatis.plugin.*;

import com.github.vertical_blank.sqlformatter.SqlFormatter;


import java.sql.Connection;

import java.util.Map;

import java.util.Properties;


@Intercepts({

    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})

})

public class SqlFormattingInterceptor implements Interceptor {


    @Override

    public Object intercept(Invocation invocation) throws Throwable {

        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();

        // 원본 SQL 가져오기

        String originalSql = statementHandler.getBoundSql().getSql();

        Object parameterObject = statementHandler.getBoundSql().getParameterObject();


        // SQL 포매팅 및 파라미터 처리

        String formattedSql = formatSqlWithParameters(originalSql, parameterObject);


        // 로그 출력

        System.out.println("Formatted SQL:");

        System.out.println(formattedSql);


        return invocation.proceed();

    }


    private String formatSqlWithParameters(String sql, Object parameterObject) {

        // SQL을 포매팅

        String prettySql = SqlFormatter.format(sql);


        // 파라미터 정보를 하단에 추가

        StringBuilder parameterComments = new StringBuilder();

        if (parameterObject instanceof Map) {

            Map<String, Object> paramMap = (Map<String, Object>) parameterObject;

            for (Map.Entry<String, Object> entry : paramMap.entrySet()) {

                String paramName = entry.getKey();

                Object value = entry.getValue();

                parameterComments.append("/* :")

                        .append(paramName)

                        .append(" = ")

                        .append(value)

                        .append(" */\n");

            }

        }


        // 포매팅된 SQL과 파라미터 주석 결합

        return prettySql + "\n" + parameterComments.toString();

    }


    @Override

    public Object plugin(Object target) {

        return Plugin.wrap(target, this);

    }


    @Override

    public void setProperties(Properties properties) {

        // 필요에 따라 설정 추가

    }

}



Releases · vertical-blank/sql-formatter


댓글 없음: