ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iBATIS/MyBatis SQL 동적 조건 설정 - 날짜 필드 기반 필터링
    DataBase/iBatis 2024. 9. 30. 10:36
    반응형

    <sql id="whereByDateType">는 SQL에서 특정 날짜 타입을 기준으로 검색 조건을 설정하는 구문을 정의한 것입니다. 이 SQL 매핑 방식은 MyBatis와 같은 ORM 프레임워크에서 사용되며, 조건에 따라 동적으로 SQL 쿼리를 생성하는 역할을 합니다.

     

    • property: 비교하려는 동적 파라미터의 이름을 지정합니다.
    • compareValue: property에 담긴 값과 비교할 값을 지정합니다.

     

    1. 구문 설명

    <isEqual property="dateType" compareValue="created_date">

    • 이 구문은 dateType이라는 파라미터의 값이 created_date와 동일할 때, 해당 조건을 SQL에 추가합니다.
    • 만약 dateType이 created_date라면, created_date 필드가 startDate와 endDate 사이에 있는 데이터를 조회하는 조건을 추가하게 됩니다.
    • #startDate#와 #endDate#는 MyBatis가 SQL 쿼리 실행 시 동적으로 바인딩하는 파라미터입니다.

    각 날짜 타입별 설명:

    1. created_date:
      • created_date >= #startDate#와 created_date <= #endDate#는 created_date 필드가 startDate와 endDate 범위 내에 있는 데이터를 필터링합니다.
      • created_date는 데이터를 생성한 날짜를 의미할 수 있습니다.
    2. updated_date:
      • updated_date >= #startDate#와 updated_date <= #endDate#는 updated_date 필드가 주어진 범위 내에 있는 데이터를 조회합니다.
      • updated_date는 데이터를 마지막으로 수정한 날짜를 의미합니다.
    3. response_date:
      • response_date BETWEEN #startDate# AND #endDate#는 response_date 필드가 주어진 날짜 범위에 속하는 데이터를 조회합니다.
      • 이 조건은 데이터의 응답 날짜(response_date)가 startDate와 endDate 사이에 있을 때 데이터를 필터링합니다.
    4. survey_date:
      • survey_date BETWEEN #startDate# AND #endDate#는 survey_date 필드가 지정된 범위 내에 있는 데이터를 조회합니다.
      • 설문 응답일이 특정 날짜 범위 내에 있을 때 필터링합니다.
    <sql id="whereByDateType">
        <isEqual property="dateType" compareValue="created_date">
            AND q.created_date &gt;= #startDate#
            AND q.created_date &lt;= #endDate#
        </isEqual>
        <isEqual property="dateType" compareValue="updated_date">
            AND q.updated_date &gt;= #startDate#
            AND q.updated_date &lt;= #endDate#
        </isEqual>
        <isEqual property="dateType" compareValue="response_date">
            AND response_date BETWEEN #startDate# AND #endDate#
        </isEqual>
        <isEqual property="dateType" compareValue="survey_date">
            AND survey_date BETWEEN #startDate# AND #endDate#
        </isEqual>
    </sql>

    2. 활용 예시

    1) SQL에서 동적으로 조건을 설정하는 예시

    예를 들어, dateType 파라미터가 created_date로 설정되었다면, SQL 쿼리는 아래와 같이 변환됩니다:

    SELECT * FROM test
    WHERE created_date >= '2023-01-01'
    AND created_date <= '2023-12-31';

    위 쿼리는 2023-01-01부터 2023-12-31 사이에 생성된 데이터를 조회합니다.

     

     

    2) MyBatis 매퍼 XML에서의 사용 예시

    <select id="selectTestList" resultType="testForm">
        SELECT test_id, created_date, updated_date, response_date
        FROM test
        WHERE 1 = 1
        <include refid="whereByDateType"/>
    </select>

    dateType에 따라 특정 조건이 동적으로 추가됩니다. 만약 dateType이 updated_date라면 다음과 같은 쿼리가 생성됩니다.

     

    SELECT test_id, created_date, updated_date, response_date
    FROM test
    WHERE updated_date >= '2023-01-01'
    AND updated_date <= '2023-12-31';

     

    3) MyBatis 매핑 예시

    Java 코드에서 dateType을 설정하고, startDate와 endDate를 지정하여 호출합니다.

    Map<String, Object> params = new HashMap<>();
    params.put("dateType", "created_date"); // "created_date", "updated_date", "response_date", "survey_date" 가능
    params.put("startDate", "2023-01-01");
    params.put("endDate", "2023-12-31");
    
    List<Test> testList = sqlSession.selectList("selectTestList", params);

    위 코드는 created_date에 따라 동적으로 SQL을 구성하고, 해당 조건을 만족하는 데이터를 조회합니다.

    3. 결론

    <sql id="whereByDateType"> 구문은 dateType이라는 파라미터에 따라 날짜 조건을 동적으로 설정하는 유연한 SQL 조건을 만들어줍니다. 이를 통해 하나의 SQL 쿼리에서 여러 날짜 필드를 선택적으로 필터링할 수 있으며, 재사용 가능한 형태로 구현되어 유지보수에 용이합니다.

    반응형

    댓글

Designed by Tistory.