ORM2015.09.01 00:28

myBatis 로깅을 좀 더 가독성을 높이기 위한 방법을 고민하다가 아래와 같이

myBatis 플러그인 인터셉터를 이용한 방법을 사용해보았다.

아래는 select문만 처리한 예제이다.


참고로 parameterType과 resultType에 따라 코드 분기처리가 들어간다.


mybatis-config.xml

- 플러그인 등록

<plugins>

<plugin interceptor="com.my.app.common.dao.CommonDaoInterceptor" />

</plugins>


CommonDaoInterceptor.java

- 플러그인 구현

package com.my.app.common.dao;


import java.util.List;

import java.util.Map;

import java.util.Properties;


import org.apache.ibatis.executor.Executor;

import org.apache.ibatis.mapping.BoundSql;

import org.apache.ibatis.mapping.MappedStatement;

import org.apache.ibatis.mapping.ParameterMapping;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

import org.apache.ibatis.session.ResultHandler;

import org.apache.ibatis.session.RowBounds;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


@Intercepts({

@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})

})

public class CommonDaoInterceptor implements Interceptor {

private static final Logger logger = LoggerFactory.getLogger(CommonDaoInterceptor.class);


@SuppressWarnings("unchecked")

@Override

public Object intercept(Invocation invocation) throws Throwable {

Object[] args = invocation.getArgs();

MappedStatement ms = (MappedStatement) args[0];

Map<String, String> params = (Map<String, String>) args[1];

BoundSql boundSql = ms.getBoundSql(params);

StringBuilder sql = new StringBuilder(boundSql.getSql());

for (ParameterMapping param : boundSql.getParameterMappings()) {

String property = param.getProperty();

int index = sql.indexOf("?");

sql.replace(index, index + 1, "'" + params.get(property) + "'");

}

Object proceed = invocation.proceed();

logger.info("{} ==>  Preparing: {}", ms.getId(), sql.toString());

if (proceed != null && proceed instanceof List) {

List<Map<String, String>> list = (List<Map<String, String>>) proceed;

if (list.size() > 0) {

logger.info("{} ==>     Result: {}", ms.getId(), list.get(0));

/*for (Entry<String, String> entry : list.get(0).entrySet()) {

String key = entry.getKey();

String value = ((Object) entry.getValue()).toString();

}*/

}

logger.info("{} <==      Total: {}", ms.getId(), list.size());

}

return proceed;

}


@Override

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}


@Override

public void setProperties(Properties properties) {

logger.info("properties => {}", properties);

}


}


끝.

'ORM' 카테고리의 다른 글

myBatis list/array parameter type 처리  (0) 2018.10.23
myBatis plugin interceptor sql 바인딩 로깅 구현  (0) 2015.09.01
Java + MyBatis  (0) 2011.09.21
Posted by 수앙 수앙

댓글을 달아 주세요