[스프링부트] 동적쿼리(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'”)