-
Mybatis 쿼리문 추출IT/Spring 2019. 6. 28. 15:16
일정시간 이상 걸리는 쿼리문을 DB에 저장할 일이 생겼다. (자동화는 항상 옳다)
DB에 저장하기위해 쿼리문을 String으로 추출해야했고 Mybatis는 기본적으로 xml파일 설정으로 돌렸는데 이 경우에는 자바코드에서 다뤄야 했다.
어떻게 할지 머리를 굴리며 구글링을 해보니 SqlSession 객체를 통해 쿼리문을 추출하는 코드가 있었다.
123456789101112131415private String getSql(String id, Map param) throws Exception{String sql = sqlSession.getConfiguration().getMappedStatement(id).getBoundSql(param).getSql();List<ParameterMapping> paramMap = sqlSession.getConfiguration().getMappedStatement(id).getBoundSql(param).getParameterMappings();for (ParameterMapping par : paramMap) {String parameter = null;if(parameter = null)sql = sql.replaceFirst("\\?", "NULL");elsesql = sql.replaceFirst("\\?", "'" + parameter + "'");}return sql;}Colored by Color Scripter코드는 위와 같이 작성하였고, id와 param에 대해 잠깐 설명을 하자면
12<mapper namespace="Lambdadelta">Mybatis xml파일을 기준으로 id에 namespace.id 를 넣어주면된다, 위와 같은경우 Lambdadelta.Test가 된다. (나만 햇갈렸나?)
param은 원래 넣어주던 파라미터 객체이다.
(Mybatis의 쿼리문 로깅 내부구현도 xml을 파싱한 후 저렇게 처리하는게 아닐까 싶다.)
* 본문과 상관없는 잡설
String sql = sqlSession.getConfiguration().getMappedStatement(id).getBoundSql(param).getSql();
부분에서 sql을 확인해보면 다음과 같이 동적 sql 구문으로 나오게된다.
12SELECT ?, ?, ?FROM TB_LAMBDADELTA어차피 파라미터도 안들어가는거 getBoundSql(param)에 param을 넣어줄 필요가 있나싶어서 getBoundSql(new Object) 와 같이 집어넣어보았는데 어떤경우에는 잘 돌아가고 어떤경우에는 parameter가 없다고 Exception이 뜬다.
Exception이 뜨는걸보면 내부적으로 어떻게든 써먹는거같은데 안뜨는경우는 또 뭘까...
'IT > Spring' 카테고리의 다른 글
Mybatis 캐시문제 (1) 2019.06.28