ToBe끝판왕

[ MyBatis ] 마이바티스 동적쿼리 본문

■ 프로그래밍 SKILLS/MYBATIS , JPA

[ MyBatis ] 마이바티스 동적쿼리

업그레이드중 2024. 11. 20. 22:28
반응형

 

 

 


 

 

MyBatis 프레임워크 - 동적쿼리

 

■  MyBatis
-  개발자들이 SQL 쿼리를 쉽게 작성하고 관리할 수 있도록 도와주는 퍼시스턴스 프레임워크입니다.
-  SQL 쿼리와 프로그래밍 코드를 분리 및 관리 가능하여 코드의 가독성과 재사용성을 높이고 유지 보수를 용이하게 합니다.
-  JDBC 코드의 복잡성을 추상화하고 SQL 쿼리의 실행 결과와 자바 객체에 매핑하기 위한 강력한 매핑 기능을 제공합니다.

 

 

 

1) MyBatis 동적쿼리란 ?

 

•  SQL 쿼리를 동적으로 생성

-  다양한 검색 조건 처리 가능함

-  실행 시점에 필요한 부분만 생성하여 실행

 

 

 

2) MyBatis 동적쿼리의 중요 요소와 예시

 

•  if

-  특정 조건에 따라 SQL 문장의 일부를 포함하거나 제외 가능토록 하는 태그

-  test 속성  :  test 속성의 조건값이 참이라면 if 블록내의 SQL이 실행된다.

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUsers" resultType="com.example.domain.User">
        SELECT * FROM users
        <where>
            <if test="name != null and name != ''">
                name LIKE CONCAT('%', #{name}, '%')
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
        <order by="id">
    </select>
</mapper>

 

 

 

•  choose / when / otherwise

-  여러개의 조건 중 하나를 선택하여 SQL 생성하게 하는 태그

-  < choose >  :  여러개의 < when > 중에서 조건에 맞는 하나를 선택하여 실행

-  < when test=" " >  :  특정조건이 충족될 때, 수행되는 SQL

-  < otherwise >  :  < when > 구문 중 어떤 것도 충족되지 않을 때 실행되는 SQL

<choose>
    <when test="type == 'A'">
        AND type = 'A'
    </when>
    <when test="type == 'B'">
        AND type = 'B'
    </when>
    <otherwise>
        AND type IS NULL
    </otherwise>
</choose>

 

 

 

•  foreach

-  List 나 Map과 같은 컬렉션을 반복하여 SQL 생성

-  주로 반복적인 구문을 처리할 때 사용된다.

-  collection 속성  :  반복문에 사용할 컬렉션 지정 ( 필수 )

-  item 속성  :  반복문에서 사용할 아이템 이름 설정

-  separator 속성  :  요소들 사이마다 구분자 지정

<select id="selectUsers" resultType="User">
    SELECT * FROM users
    <where>
        <if test="name != null and name != ''">
            name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="roles != null and roles.size > 0">
            AND id IN
            <foreach collection="roles" item="role" separator=",">
                #{role}
            </foreach>
        </if>
    </where>
    ORDER BY id
</select>

 

 

 

•  include

-  하나의 SQL 구문을 여러 SQL 매퍼에 재사용할 수 있도록 하는 기능

-  중복 코드를 줄이고 가독성과 유지보수성을 높이는데 도움이 된다.

-  refid 속성  :  재사용할 SQL을 정의한 id값을 지정 ( id는 중복되지 않아야 한다. )

<mapper namespace="com.example.mapper.UserMapper">
    <sql id="commonColumns">
        id, name, age
    </sql>

    <select id="selectUserById" resultType="User">
        SELECT <include refid="commonColumns" />
        FROM users
        WHERE id = #{userId}
    </select>

    <select id="selectUsersByName" resultType="User">
        SELECT <include refid="commonColumns" />
        FROM users
        WHERE name LIKE CONCAT('%', #{name}, '%')
    </select>
</mapper>

 

 

 

•  <![CDATA[  ]]>

쿼리문에서 비교연산자나 부등호를 사용할 경우 '>', '=', '<', '&'.. 태그인지 실제 쿼리에 필요한 연산자나 부등호인지 알수없음
-  XML안의 특수문자로 인한 파싱 오류를 방지하기 위해 사용

-   <![CDATA[ ]]> 태그를 사용하면 동적쿼리를 사용할 수 없게된다. 동적쿼리와 <![CDATA[ ]]> 태그를 함께 사용하고 싶은 경우 쿼리문 전체를 감싸지 않고, 특수문자가 있는 코드만 감싸주면 된다.

<select id="getEmployee" resultType="EmployeeVO">
    SELECT *
    FROM EMPLOYEES
    WHERE 1=1 AND
        <![CDATA[
            SALARY > 2000
        ]]>
</select>

 

 

반응형
Comments