Mybatis 튜토리얼 4 (동적 SQL 문)

MyBatis 동적 SQL 문

일반적으로 mybatis 동적 SQL 문에는 주로 다음 범주가 있습니다.

  1. if 문 (단순한 조건부 판단)
  2. select (when, otherwize)는 자바 언어로 전환하는 것과 동일하며 jstl에서 선택하는 것과 매우 유사합니다.
  3. 트림 (포함 된 콘텐츠에 접두사 또는 접미사 등, 접두사, 접미사 추가)
  4. where (주로 SQL 문에서 where 조건의 판단을 단순화하는 데 사용되며, 처리 할 수 ​​있고 지능적으로 처리 할 수 ​​있으며 문법 오류를 초래하는 중복에 대해 걱정하지 마십시오)
  5. 설정 (주로 업데이트 할 때 사용됨)
  6. foreach (문 쿼리에서 mybatis를 구현할 때 특히 유용함)

만약

동적 SQL이 일반적으로 수행하는 작업은 where 절의 일부를 조건부로 포함하는 것입니다. 예 :

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

이 문은 선택적 텍스트 검색 유형 기능을 제공합니다. "title"이 전달되지 않으면 "ACTIVE"상태의 모든 BLOG가 반환되고, "title"이 전달되면 "title"콘텐츠에 대한 퍼지 검색의 BLOG 결과가 반환됩니다.

선택, 때, 그렇지 않으면

때로는 모든 조건문을 사용하지 않고 하나 또는 두 개만 선택하고 싶을 때가 있습니다. 이러한 상황에 대응하여 MyBatis는 Java의 switch 문과 비슷한 choose 요소를 제공합니다 .

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

트림, 위치, 설정

이전 예제는 악명 높은 동적 SQL 문제를 적절하게 해결했습니다. 이제 "if"예제로 돌아가서 이번에는 "ACTIVE = 1"을 동적 조건으로 설정하여 어떤 일이 발생하는지 확인합니다.

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE 
  <if test="state != null">
    state = #{state}
  </if> 
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

이러한 조건이 일치하지 않으면 어떻게됩니까? 결국이 SQL은 다음과 같이됩니다.

SELECT * FROM BLOG
WHERE

이로 인해 쿼리가 실패합니다. 두 번째 조건 만 일치하면 어떻게됩니까? 이 SQL은 다음과 같이 끝납니다.

SELECT * FROM BLOG
WHERE 
AND title like ‘yiibai.com’

MyBatis에는 90 %의 경우에 유용한 간단한 프로세스가 있습니다. 그리고 사용할 수없는 곳에서는 처리 방법을 사용자 정의하여 제대로 작동하도록 할 수 있습니다. 간단한 수정으로 원하는 효과를 얻을 수 있습니다.

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

where 요소는 둘 이상의 if 조건에 값이있는 경우에만 "WHERE"절을 삽입하는 것을 알고 있습니다. 또한 최종 콘텐츠가 "AND"또는 "OR"로 시작하는 경우 where 요소는이를 제거하는 방법도 알고 있습니다.
where 요소가 정상적인 패턴을 따르지 않는 경우 트림 요소를 사용자 지정하여 원하는 기능을 사용자 지정할 수 있습니다. 예를 들어 where 요소에 해당하는 사용자 정의 트림 요소는 다음과 같습니다.

<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>

prefixOverrides 속성은 파이프로 구분 된 텍스트 시퀀스를 무시합니다 (이 예의 공백 도 필요함). 결과적으로 prefixOverrides 속성에 지정된 모든 컨텐츠가 제거되고 prefix 속성에 지정된 컨텐츠가 삽입됩니다. 동적 업데이트 문에 대한 유사한 솔루션을 set이라고합니다. set 요소는 업데이트해야하는 열을 동적으로 포함하고 나머지는 제외하는 데 사용할 수 있습니다. 예 :

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

여기서, set 요소는 SET 키워드 앞에 동적으로 선행하고 불필요한 쉼표도 제거합니다. 조건문이 사용 된 후에 이러한 쉼표가 생성 된 할당 명령문 뒤에 남을 가능성이 있기 때문입니다.
동등한 사용자 정의 트림 요소가 어떻게 생겼는지에 관심이 있다면 이것이 진정한 얼굴이어야합니다.

<trim prefix="SET" suffixOverrides=","> ... </trim>

각각

동적 SQL의 또 다른 일반적이고 필요한 작업은 일반적으로 IN 조건문을 구성 할 때 컬렉션을 탐색해야한다는 것 입니다. 예 :

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

foreach 요소의 기능은 매우 강력하며 컬렉션을 지정하고 요소 본문에서 사용할 수있는 컬렉션 항목인덱스 변수 를 선언 할 수 있습니다 . 또한 일치 항목을 열고 닫기위한 문자열을 지정하고 반복 중간에 구분 기호를 배치 할 수 있습니다. 이 요소는 매우 영리하므로 실수로 구분 기호를 추가하지 않습니다. List 인스턴스 또는 배열을 매개 변수 개체로 MyBatis에 전달할 수 있습니다. 이렇게하면 MyBatis가 자동으로이를 Map에 래핑 하고 이름을 키로 사용합니다. 목록 인스턴스에는 키로 "list"가 있고 배열 인스턴스에는 키로 "array"가 있습니다.

추천

출처blog.csdn.net/weixin_43278644/article/details/87861008