[MyBatis] SQL 동적 생성

배세훈·2021년 11월 4일
0

MyBatis

목록 보기
2/3

sample_mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://maybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.TestMapper"> <!-- Mapper을 namespace에 지정 -->
</mapper>

TestMapper.java

// Mapper 인터페이스로 만든다

public interface TestMapper{
	// @SelectProvider으로 SQL을 생성하는 클래스 메소드를 설정한다.
    @SelectProvider(type=TestSqlProvider.class, method="selectTestSql")
    List<Test> selectTest();
}

TestSqlProvider.java

// SQL을 생성하는 클래스
public class TestSqlProvider{
	// SQL 클래스를 사용하여 SQL을 생성한다.
    SQL sql = new SQL(){{
    	SELECT("id, name");
        SELECT("mobile");
        SELECT("email");
        FROM("test");
    }};
    
    return sql.toString();
}
실행 결과
[DEBUG] s.m.T.selectTest - ==> Preparing: SELECT id, name, mobile, email FROM test
  • Mapper의 메소드를 @SelectProvider에서 어노테이션을 지정한다.
    - type에 SQL을 생성하는 클래스로 하고, method에 SQL을 생성하는 메소드의 이름을 지정한다.
    • INSERT 또는 UPDATE에는 @InsertProvider과 @UpdateProvider가 있다.
    • SQL 생성에는 org.apache.ibatis.jdbc.SQL 클래스를 사용한다.
    • SQL 클래스를 익명 클래스로 new하여 인스턴스 초기화 블록에서 SELECT()와 FROM() 메소드를 사용하여 SQL을 생성한다.
    • 각 인수는 문자열에서 SQL의 항목을 전달한다.
    • 이때 쉼표 구분 등은 필요에 따라 추가되기도 한다.
  • 생성된 SQL 인스턴스의 toString() 메소드에서 생성한 SQL을 문자열로 검색할 수 있다.

각 메소드의 사용방법

SELECT

new SQL(){{
	SELECT("id");
    SELECT("name");
    SELECT("email");
    FROM("user");
}};
  • 결과
    SELECT id, name, email FROM user

  • 연속하여 작성하면 각 항목을 쉼표로 마음대로 구분된다.

  • 명시적으로 쉼표로 구분된 문자열 전달도 된다.

  • 끝에 불필요한 쉼표가 있는 경우 제거해 주지 않는다.

FROM

new SQL(){{
	SELECT("*");
    FROM("user");
    FROM("address");
}};
  • 결과
    SELECT * FROM user, address

WHERE

new SQL(){{
	SELECT("*");
    FROM("user");
    WHERE("id = test");
    WHERE("name = 홍길동");
    AND();
    WHERE("email = test@test.com");
    OR();
    WHERE("mobile = 01011112222");
}};
  • 결과
SELECT * 
	FROM users
    	WHERE ( id = test AND name = 홍길동) 
        AND email = test@test.com
        OR mobile = 01011112222
  • WHERE() 메소드로 WHERE 절을 생성할 수 있다.
  • WHERE() 메소드를 연속하여 작성하면 AND 조건으로 연결된다.
  • AND() 및 OR() 메소드를 사용하면 AND, OR로 연결할 수 있다.

ORDER_BY

new SQL(){{
	SELECT("*");
    FROM("user");
    ORDER_BY("ID");
    ORDER_BY("NAME");
}};
  • 결과
    SELECT * FROM USER ORDER BY ID, NAME DESC

GROUP_BY

new SQL(){{
	SELECT("id, name");
    FROM("USER");
    GROUP_BY("id");
    GROUP_BY("name");
}};

SELECT id, name FROM user GROUP BY id, name

  • GROUP_BY() 메소드로 GROUP BY 절을 생성할 수 있다.
  • 연속하여 작성되면 자동으로 쉼표로 구분된다.

HAVING

new SQL(){{
	SELECT("id, count(*)");
    FROM("user");
    GROUP_BY("id");
    Having("0 < count(*)");
    HAVING("count(*) < 100");
}};
  • 결과
SELECT id, count(*)
	FROM user
    	GROUP BY id
        	HAVING ( 0 < count(id)
            		AND count(id) < 100
                    )
profile
성장형 인간

0개의 댓글