개발자 도전기
[SQL] 동적 SQL(Dynamic SQL) 본문
Dynamic SQL
사용할 SQL문이 Runtime시에 결정되어 SQL 쿼리를 동적으로 수행할 수 있게 해줍니다
SQL문 내부에서 사용합니다
https://mybatis.org/mybatis-3/dynamic-sql.html
mybatis – MyBatis 3 | Dynamic SQL
Dynamic SQL One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities. If you have any experience with JDBC or any similar framework, you understand how painful it is to conditionally concatenate strings of SQL together, mak
mybatis.org
아래의 예시에서는 어노테이션을 사용한 매퍼 클래스에서 동적 SQL을 작성하였는데, 이때는 <script> 코드 내부에 작성하여야 한다
<if> 태그
@Select("""
<script>
SELECT *
FROM my_table
<if test="lastName neq null">
WHERE LastName = 'abc'
</if>
<if test="lastName eq null">
WHERE FirstName = 'abc'
</if>
</script>
""")
Object query2(MyBean255Employee e);
test 속성의 값이 참일 때 <if> 태그 내부의 쿼리가 포함됩니다.
- lastName의 값이 null이 아닐 경우 WHERE LastName = 'abc' 쿼리가 포함됩니다
- lastName의 값이 null일 경우 WHERE FirstName = 'abc' 쿼리가 포함됩니다
<trim> 태그
@Select("""
<script>
SELECT * FROM my_table
<trim prefix="WHERE" prefixOverrides="OR">
<if test="lastName != null">
OR LastName = #{lastName}
</if>
<if test="firstName != null">
OR FirstName = #{firstName}
</if>
</trim>
</script>
""")
Object query5(MyBean255Employee e);
preifx : 실행될 쿼리의 <trim> 문 안의 쿼리 가장 앞에 붙여줍니다
prefixOverrides : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 앞에 해당하는 문자들이 있으면 자동으로 지워줍니다
- preifx = WHERE : WHERE이 삽입됩니다
- prefixOverrides = OR : LastName이 null이 아니어서 OR LastName = ... 의 쿼리가 될 경우 OR를 지워줍니다
<bind> 태그
@Select("""
<script>
<bind name="patternKeyword" value='"%" + keyword + "%"' />
SELECT *
FROM Employees
WHERE notes LIKE #{patternKeyword}
</script>
""")
List<MyBean255Employee> query6(String keyword);
파라미터의 값을 받아 새로운 문자열으로 바인딩 해줍니다. 바인딩 된 문자열은 name 속성에 저장된 이름으로 사용될 수 있습니다
CDATA
쿼리 작성시 조건식에 들어가는 >, < 등을 태그로 인식하지 못하게 하기 위해 사용하는 태그입니다
@Select("""
<script
<![CDATA[
SELECT * FROM Products
WHERE Price < 5
]]>
</script>
""")
Object query7();
'개발공부 > SQL' 카테고리의 다른 글
[SQL] 집계함수(aggregate function), GROUP BY, HAVING (0) | 2024.05.01 |
---|---|
[SQL] JOIN (0) | 2024.04.30 |
[SQL] 정규화(Normalization) (0) | 2024.04.29 |
[SQL] 데이터 타입과 제약조건 (0) | 2024.04.26 |
[SQL] 명령문 (0) | 2024.04.17 |