반응형
오늘은 MyBatis에서 동적 SQL을 처리할 때 자주 사용되는 <if>와 <choose> 태그를 학습합니다. 이 태그들은 SQL의 조건문을 동적으로 구성할 수 있도록 도와줍니다.
1. <if> 태그란?
- <if> 태그는 특정 조건에 따라 SQL 구문을 동적으로 추가하거나 제거할 수 있습니다.
- Boolean 타입의 조건을 사용하며, 조건이 true일 때만 해당 SQL이 실행됩니다.
2. 실습: <if> 태그 사용하기
(1) 매퍼 파일 작성
아래는 employee_id와 department_id로 직원 정보를 검색하는 예제입니다. 두 필드는 선택적으로 사용할 수 있습니다.
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="getEmployees" resultType="com.example.domain.Employee">
SELECT *
FROM employees
WHERE 1=1
<if test="employeeId != null">
AND employee_id = #{employeeId}
</if>
<if test="departmentId != null">
AND department_id = #{departmentId}
</if>
ORDER BY employee_id
</select>
</mapper>
설명:
- WHERE 1=1: 동적 SQL을 쉽게 추가하기 위해 기본 조건으로 사용됩니다.
- <if test="조건">: 조건이 true일 경우에만 해당 SQL이 추가됩니다.
(2) Mapper 인터페이스 작성
package com.example.mapper;
import com.example.domain.Employee;
import java.util.List;
import java.util.Map;
public interface EmployeeMapper {
List<Employee> getEmployees(Map<String, Object> params);
}
(3) 테스트 코드 작성
package com.example;
import com.example.domain.Employee;
import com.example.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class TestRunner implements CommandLineRunner {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public void run(String... args) throws Exception {
Map<String, Object> params = new HashMap<>();
params.put("employeeId", 101); // 또는 null
params.put("departmentId", null); // 또는 값 설정
List<Employee> employees = employeeMapper.getEmployees(params);
for (Employee employee : employees) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
}
}
}
3. <choose> 태그란?
- <choose> 태그는 Java의 switch 문과 유사한 역할을 합니다.
- 하나의 조건이 true인 경우 해당 조건의 SQL을 실행하며, 나머지 조건은 무시됩니다.
- <when>: 각 조건을 정의.
- <otherwise>: 모든 조건이 false일 경우 실행할 SQL.
4. 실습: <choose> 태그 사용하기
(1) 매퍼 파일 작성
다음은 employee_id 또는 department_id 중 하나의 조건으로 직원 정보를 검색하는 예제입니다.
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="getEmployeeByChoice" resultType="com.example.domain.Employee">
SELECT *
FROM employees
WHERE
<choose>
<when test="employeeId != null">
employee_id = #{employeeId}
</when>
<when test="departmentId != null">
department_id = #{departmentId}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</select>
</mapper>
(2) Mapper 인터페이스 작성
package com.example.mapper;
import com.example.domain.Employee;
import java.util.Map;
public interface EmployeeMapper {
Employee getEmployeeByChoice(Map<String, Object> params);
}
(3) 테스트 코드 작성
package com.example;
import com.example.domain.Employee;
import com.example.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class TestRunner implements CommandLineRunner {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public void run(String... args) throws Exception {
Map<String, Object> params = new HashMap<>();
params.put("employeeId", null); // 또는 값 설정
params.put("departmentId", 10); // 또는 null
Employee employee = employeeMapper.getEmployeeByChoice(params);
if (employee != null) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
} else {
System.out.println("No matching employee found.");
}
}
}
5. 오늘의 요약
- <if> 태그는 조건에 따라 SQL 문을 동적으로 추가/제거할 수 있습니다.
- <choose> 태그는 여러 조건 중 하나만 실행되도록 설계되었습니다.
- 동적 SQL 처리를 통해 더 유연하고 재사용 가능한 매퍼를 설계할 수 있습니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
MyBatis의 동적 SQL 처리 - <set> 태그 (0) | 2024.12.31 |
---|---|
MyBatis의 동적 SQL 처리 - <where>와 <trim> 태그 (0) | 2024.12.31 |
MyBatis에서 반복문 처리 - <foreach> 태그 (0) | 2024.12.31 |
MyBatis의 동적 SQL 사용법 (0) | 2024.12.31 |
MyBatis를 사용한 Oracle 데이터 페이징 처리 (0) | 2024.12.31 |