DB프로그래밍

[스프링부트] 동적쿼리(DynamicSql) 작성방법 Sql.java 구현 예제

Sqls.java 파일로 쿼리를 작성할때 동적쿼리를 Mybatis Provider를 사용하여 구현하는 방법에 대한 기록이다.

마이바티스를 이용한 동적쿼리 작성방법은 다음과 같다.

[Mybatis 3] 마이바티스 동적SQL 사용 예제 총정리

참고로 테이블명을 파라미터로 전달받아서 처리하는 것은 모든 고객사들이 보안정책으로 금기하고 있을 것이다.  그리고 또 하나는 파라미터로 받을 때 절대 $를 사용하여 받으면 안된다. SQL인젝션이 가능해지기 때문이다. 참고로 모의해킹때 다 걸린다.

동적쿼리예제

Public class testQrySql {

   public String selectUserInfo(String userId, String mobile, String grpId) {

      return new SQL() {{

          if(grpId.equals(“A”)){

               SELECT(“/*+ ORDERED INDEX(A TB_IDX01) */ ” + “S.UsetName”);

          } else {

                SELECT(“/*+ ORDERED INDEX(A TB_IDX02) */ ” + “S.UsetName”);

          }

          SELECT(“S.adress”);

          SELECT(“S.zip”);

           FROM(“TB_USER S, TB_USER_DTL B”);

           FROM(“TB_BASE C”);

           WHERE(“S.ID = B.ID”);

            WHERE(“S.uesrId = #{userId, jdbcType=VARCHAR}”);

             WHERE(“B.GRP_ID =#{grpId}”);

            ORDER_BY(“S.ID, B.GRP_ID”);

      }}.toString();

   }

}

다음 두번째 예제는 StringBuffer 혹은 StringBuilder를 사용하여 동적쿼리를 생성하는 예제이다.

앞뒤 다 생략하고 리턴부분만 기록하였다.

return new SQL() {{

   StringBuffer qry = new StringBuffer();

    if(grpId.equals(“A”)){

         try.append(SELECT (“/*+ ORDERED INDEX(A TB_IDX01) */ S.UsetName”);

     } else {

         try.append(SELECT (“/*+ ORDERED INDEX(A TB_IDX02) */ S.UsetName”);

     }

      qry.append(“S.adress, S.zip”);

      qry.append(“FROM TB_USER S, TB_USER_DTL B, TB_BASE C”);

       qry.append(“WHERE S.ID = B.ID AND S.uesrId = :userId “);

       qry.append(“ORDER BY S.ID, B.GRP_ID”);

}}.toString();

나중에 사용할일이 있을지도….

참고로 첫 번째 예제와 두 번째 예제를 짬뽕해서 해도 된다.

Mybatis Provider Code 자동 생성방법

만약 완성된 쿼리가 있다면  디비버툴에서 Dbeaver의 External Formatter를 사용하여 SQL을 Mybatis Provider Code로 전환할 수 있다.

쿼리를 전체 선택 후 CTRL + SHIFT + F 단축키를 누르면 Mybatis Provider Code로 자동 생성된다.

아래 예시처럼 전환된다. 참고로 단축키대신 메뉴이용도 가능하다. 쿼리 선택 후 마우스 우클릭 > Format > Format SQL 선택

Original SQL

SELECT * FROM TB_USER WHERE USER_ID = ‘test’

Mybatis Jave Code

SELECT(“*”)

FROM(“TB_USER”)

WHERE(“USER_ID = ‘test'”)

error: Content is protected !!