아키텍처와 함께

블로그 이미지
by gregorio
  • Total hit
  • Today hit
  • Yesterday hit

Mybatis 사용 시 SQL LOG를 Log 파일에 추가하는 Source Code이다.

BoundSql을 사용하면 파라미터를 SQL에 매핑하지 못하는데 이를 해결하기 위해

SQL 호출 시 사용하는 Value Object를 파라미터를 받아 Field Name과 Value를 Map으로

변환하여 SQL의 파라미터와 매핑한다.

 

public class SqlLogger {

private static final Logger SQL = LoggerFactory.getLogger("sqllog");

/**
 * Logging SQL with parameter
 * @param sqlId
 * @param params
 * @throws Exception
 */
public static void logging(String sqlId, Object params) throws Exception {

SqlSessionFactory sqlSessionFactory = BaseContext.getBean("sqlSessionFactory");

SqlSession session = sqlSessionFactory.openSession();
MappedStatement ms = session.getConfiguration().getMappedStatement(sqlId);
BoundSql boundSql = ms.getBoundSql(params);
List mappedParams = boundSql.getParameterMappings();
String  finalSql = boundSql.getSql();
    finalSql = finalSql.trim();
    finalSql = finalSql.replaceAll("\\s+", " ");
        if (params instanceof String || params instanceof Integer || params instanceof Long) {
     finalSql = finalSql.replaceFirst("\\?", String.valueOf(params));
        }
        else {
     Map<String, Object > fieldInfo = fieldInfo(params);
         for (ParameterMapping pm : mappedParams) {
          if (fieldInfo.containsKey(pm.getProperty())) {
          String value = null;
          if (fieldInfo.get(pm.getProperty()) instanceof String) {
          value = String.format("'%s'", String.valueOf(fieldInfo.get(pm.getProperty())));
          }
          else {
          value = String.valueOf(fieldInfo.get(pm.getProperty()));
          }
                 finalSql = finalSql.replaceFirst("\\?", value);
             }
         }        
        }
SQL.info("{}", finalSql);
}

/**
 * Extract object field value
 * @param object
 * @return
 * @throws Exception
 */
public static Map<String, Object> fieldInfo(Object object) throws Exception {
Map<String, Object> fieldInfo = new HashMap<String, Object>();

List fields = FieldUtils.getAllFieldsList(object.getClass());
for (Field field : fields) {
field.setAccessible(true);
Object value = field.get(object) != null ? field.get(object) : "";
fieldInfo.put(field.getName(), value);
}
return fieldInfo;
}
}

AND

ARTICLE CATEGORY

분류 전체보기 (56)
Spring Framrwork (33)
Linux (1)
APM (1)
Java (8)
python (0)
ant (1)
chart (1)
OS (1)
tomcat (1)
apache (1)
database (0)

RECENT ARTICLE

RECENT COMMENT

CALENDAR

«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ARCHIVE

LINK