-
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 쿼리 실행 시 동적으로 바인딩하는 파라미터입니다.
각 날짜 타입별 설명:
- created_date:
- created_date >= #startDate#와 created_date <= #endDate#는 created_date 필드가 startDate와 endDate 범위 내에 있는 데이터를 필터링합니다.
- created_date는 데이터를 생성한 날짜를 의미할 수 있습니다.
- updated_date:
- updated_date >= #startDate#와 updated_date <= #endDate#는 updated_date 필드가 주어진 범위 내에 있는 데이터를 조회합니다.
- updated_date는 데이터를 마지막으로 수정한 날짜를 의미합니다.
- response_date:
- response_date BETWEEN #startDate# AND #endDate#는 response_date 필드가 주어진 날짜 범위에 속하는 데이터를 조회합니다.
- 이 조건은 데이터의 응답 날짜(response_date)가 startDate와 endDate 사이에 있을 때 데이터를 필터링합니다.
- survey_date:
- survey_date BETWEEN #startDate# AND #endDate#는 survey_date 필드가 지정된 범위 내에 있는 데이터를 조회합니다.
- 설문 응답일이 특정 날짜 범위 내에 있을 때 필터링합니다.
<sql id="whereByDateType"> <isEqual property="dateType" compareValue="created_date"> AND q.created_date >= #startDate# AND q.created_date <= #endDate# </isEqual> <isEqual property="dateType" compareValue="updated_date"> AND q.updated_date >= #startDate# AND q.updated_date <= #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 쿼리에서 여러 날짜 필드를 선택적으로 필터링할 수 있으며, 재사용 가능한 형태로 구현되어 유지보수에 용이합니다.
반응형