ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mybatis 쿼리문 추출
    IT/Spring 2019. 6. 28. 15:16

    일정시간 이상 걸리는 쿼리문을 DB에 저장할 일이 생겼다. (자동화는 항상 옳다)

     

    DB에 저장하기위해 쿼리문을 String으로 추출해야했고 Mybatis는 기본적으로 xml파일 설정으로 돌렸는데 이 경우에는 자바코드에서 다뤄야 했다.

     

    어떻게 할지 머리를 굴리며 구글링을 해보니 SqlSession 객체를 통해 쿼리문을 추출하는 코드가 있었다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private 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;
            parameter = param.get(par.getProperty()).toString();
            if(parameter = null)
                sql = sql.replaceFirst("\\?""NULL");
            else
                sql = sql.replaceFirst("\\?""'" + parameter + "'");
        }
        return sql;
    }
    Colored by Color Scripter

     

    코드는 위와 같이 작성하였고, id와 param에 대해 잠깐 설명을 하자면

     

    1
    2
    <mapper namespace="Lambdadelta">
    <select id="Test" parameterType="java.util.HashMap" resultType="LowerCamelCaseMap">

     

    Mybatis xml파일을 기준으로 id에 namespace.id 를 넣어주면된다, 위와 같은경우 Lambdadelta.Test가 된다. (나만 햇갈렸나?)

     

    param은 원래 넣어주던 파라미터 객체이다.

     

    (Mybatis의 쿼리문 로깅 내부구현도 xml을 파싱한 후 저렇게 처리하는게 아닐까 싶다.)

     

     

    * 본문과 상관없는 잡설

     

    String sql = sqlSession.getConfiguration().getMappedStatement(id).getBoundSql(param).getSql();

     

    부분에서 sql을 확인해보면 다음과 같이 동적 sql 구문으로 나오게된다.

     

    1
    2
    SELECT ?, ?, ?
    FROM TB_LAMBDADELTA

     

    어차피 파라미터도 안들어가는거 getBoundSql(param)에 param을 넣어줄 필요가 있나싶어서 getBoundSql(new Object) 와 같이 집어넣어보았는데 어떤경우에는 잘 돌아가고 어떤경우에는 parameter가 없다고 Exception이 뜬다.

     

    Exception이 뜨는걸보면 내부적으로 어떻게든 써먹는거같은데 안뜨는경우는 또 뭘까...

    'IT > Spring' 카테고리의 다른 글

    Mybatis 캐시문제  (1) 2019.06.28

    댓글

Designed by Tistory.