개발/전자정부프레임워크
MyBatis의 동적 SQL 처리 - <where>와 <trim> 태그
꿈꾸는법사
2024. 12. 31. 15:27
반응형
오늘은 MyBatis에서 동적 SQL 작성을 더 효율적으로 도와주는 <where>와 <trim> 태그를 학습합니다. 이 태그들은 조건문과 SQL 문을 깔끔하게 정리하는 데 유용합니다.
1. <where> 태그란?
- <where> 태그는 조건문이 추가될 때 자동으로 WHERE 키워드를 생성합니다.
- 조건문이 없으면 WHERE 키워드를 생성하지 않아 불필요한 SQL 오류를 방지합니다.
- 선행되는 AND 또는 OR 연산자를 자동으로 처리합니다.
2. 실습: <where> 태그 사용하기
(1) 매퍼 파일 작성
다음은 여러 조건으로 직원 정보를 검색하는 예제입니다.
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="getEmployeesWithWhere" resultType="com.example.domain.Employee">
SELECT *
FROM employees
<where>
<if test="employeeId != null">
employee_id = #{employeeId}
</if>
<if test="departmentId != null">
AND department_id = #{departmentId}
</if>
<if test="jobId != null">
AND job_id = #{jobId}
</if>
</where>
</select>
</mapper>
설명:
- <where> 태그는 조건이 하나라도 있으면 자동으로 WHERE 키워드를 추가합니다.
- 조건이 여러 개일 경우 AND를 적절히 처리하여 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> getEmployeesWithWhere(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", null); // 또는 값 설정
params.put("departmentId", 10); // 또는 null
params.put("jobId", "IT_PROG"); // 또는 null
List<Employee> employees = employeeMapper.getEmployeesWithWhere(params);
for (Employee employee : employees) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
}
}
}
3. <trim> 태그란?
- <trim> 태그는 SQL 문에서 특정 문자열을 앞뒤로 추가하거나 제거할 수 있습니다.
- 동적 SQL의 선행 또는 후행 AND, OR 같은 논리 연산자를 제거하는 데 주로 사용됩니다.
4. 실습: <trim> 태그 사용하기
(1) 매퍼 파일 작성
아래는 department_id와 job_id 조건에 따라 직원 정보를 검색하는 예제입니다.
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="getEmployeesWithTrim" resultType="com.example.domain.Employee">
SELECT *
FROM employees
<trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="departmentId != null">
AND department_id = #{departmentId}
</if>
<if test="jobId != null">
AND job_id = #{jobId}
</if>
</trim>
</select>
</mapper>
설명:
- prefix="WHERE": 조건이 추가되면 WHERE 키워드가 앞에 붙습니다.
- prefixOverrides="AND |OR": 조건문 앞에 붙는 AND 또는 OR을 제거합니다.
(2) Mapper 인터페이스 작성
package com.example.mapper;
import com.example.domain.Employee;
import java.util.List;
import java.util.Map;
public interface EmployeeMapper {
List<Employee> getEmployeesWithTrim(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("departmentId", null); // 또는 값 설정
params.put("jobId", "IT_PROG"); // 또는 null
List<Employee> employees = employeeMapper.getEmployeesWithTrim(params);
for (Employee employee : employees) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
}
}
}
5. 오늘의 요약
- <where> 태그는 조건문이 추가될 때만 WHERE 키워드를 생성하며, SQL 문을 깔끔하게 유지합니다.
- <trim> 태그는 SQL의 특정 키워드나 불필요한 논리 연산자를 제거하여 동적 SQL을 보다 유연하게 작성할 수 있습니다.
반응형