2018. 7. 31. 15:42ㆍframework/MyBatis
Mybatis DAO에서 쿼리 추출 및 로그 찍기 (Log 라이브러리 사용안함)
Mybatis 를 사용하면서 쿼리를 콘솔에 찍을 일이 생겼다.
Log4j, log4sql, log4j-remix 등을 사용하면 쉽게 적용할 수 있다.
하지만 이번 포스팅에서는 위 라이브러리들을 활용하지 않고서 Mybatis만을 이용해서 진행하려 한다.
원리를 간단하게 설명하자면 다음과 같다.
1. sqlSession 에서 쿼리를 추출
2. sqlSession 에서 parameter 추출
3. 쿼리의 ? 문자열을 parameter로 치환
4. 출력
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
class SampleDao{
SqlSession sqlSession = SqlMapClient.getSqlSession();
public List<Object> getList(Map<String, Object> paramMap) {
String sql = sqlSession.getConfiguration().getMappedStatement("sample.Sample.getList").getBoundSql(paramMap).getSql();
List<ParameterMapping> parameterMappings = sqlSession.getConfiguration().getMappedStatement("sample.Sample.getList").getBoundSql(paramMap).getParameterMappings();
for (ParameterMapping parameterMapping : parameterMappings) {
String param = (String) paramMap.get(parameterMapping.getProperty());
sql = sql.replaceFirst("\\?", "'" + param + "'");
}
System.out.println("sql : " + sql);
return sqlSession.selectList("sample.Sample.getList", paramMap);
}
} |
cs |
1# : DAO 클래스
3# : SqlSession 객체 생성
5# : 리스트를 조회하는 함수
6# : statement(구문을 찾기 위해 사용될 수 있는 네임스페이스내 유일한 구분자), parameter 를 활용하여
sql를 얻음
7# : statement(구문을 찾기 위해 사용될 수 있는 네임스페이스내 유일한 구분자), parameter 를 활용하여
sql에 활용될 parameterMapping 정보를 얻음
9# : parameterMapping 정보만큼 루프
10# : parameterMapping 에 있는 프로퍼티를 paramMap의 Key로 활용하여 맵핑될 값을 추출
11# : sql에서 ? 기호를 맵핑될 값으로 차례로 치환
14# : 콘솔에 출력
parameter가 map일 경우만 작성된 소스이고 vo이거나 기타 다른 파라미터 일 경우도 고려해서 작성해야 한다.
또한 파라미터에 특수문자들이 있는 경우 오류가 발생할 수 있다.
위 소스는 테스트 용도로만 사용하길 바란다.
'framework > MyBatis' 카테고리의 다른 글
MyBatis isNull isEmpty 사용하기 (0) | 2017.06.28 |
---|---|
MyBatis resultType이 Map일경우 key를 소문자로 만들기 (2) | 2017.06.28 |
ORACLE | query 로 VO 및 mybatis, ibatis에서 사용할 컬럼, resultMap 자동생성하기 (0) | 2017.01.03 |
Mybatis > RowBounds 의 고찰 (8) | 2016.08.09 |
다이나믹 쿼리 / if / 공백체크 / 숫자 0 / 이슈 | MyBatis (2) | 2016.01.05 |
NumberformatException / if /문자 1글자 비교 / equals / 이슈 | MyBatis (4) | 2016.01.05 |