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
댓글 없음:
댓글 쓰기